Merge pull request #1712 from freqtrade/log/tofile
Allow logging to file
This commit is contained in:
commit
8002936fe3
@ -68,9 +68,9 @@ For any other type of installation please refer to [Installation doc](https://ww
|
|||||||
### Bot commands
|
### Bot commands
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: freqtrade [-h] [-v] [--version] [-c PATH] [-d PATH] [-s NAME]
|
usage: freqtrade [-h] [-v] [--logfile FILE] [--version] [-c PATH] [-d PATH]
|
||||||
[--strategy-path PATH] [--dynamic-whitelist [INT]]
|
[-s NAME] [--strategy-path PATH] [--dynamic-whitelist [INT]]
|
||||||
[--db-url PATH]
|
[--db-url PATH] [--sd-notify]
|
||||||
{backtesting,edge,hyperopt} ...
|
{backtesting,edge,hyperopt} ...
|
||||||
|
|
||||||
Free, open source crypto trading bot
|
Free, open source crypto trading bot
|
||||||
@ -84,6 +84,7 @@ positional arguments:
|
|||||||
optional arguments:
|
optional arguments:
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
|
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
|
||||||
|
--logfile FILE Log to the file specified
|
||||||
--version show program's version number and exit
|
--version show program's version number and exit
|
||||||
-c PATH, --config PATH
|
-c PATH, --config PATH
|
||||||
Specify configuration file (default: None). Multiple
|
Specify configuration file (default: None). Multiple
|
||||||
@ -100,6 +101,7 @@ optional arguments:
|
|||||||
--db-url PATH Override trades database URL, this is useful if
|
--db-url PATH Override trades database URL, this is useful if
|
||||||
dry_run is enabled or in custom deployments (default:
|
dry_run is enabled or in custom deployments (default:
|
||||||
None).
|
None).
|
||||||
|
--sd-notify Notify systemd service manager.
|
||||||
```
|
```
|
||||||
|
|
||||||
### Telegram RPC commands
|
### Telegram RPC commands
|
||||||
|
@ -6,9 +6,9 @@ This page explains the different parameters of the bot and how to run it.
|
|||||||
## Bot commands
|
## Bot commands
|
||||||
|
|
||||||
```
|
```
|
||||||
usage: freqtrade [-h] [-v] [--version] [-c PATH] [-d PATH] [-s NAME]
|
usage: freqtrade [-h] [-v] [--logfile FILE] [--version] [-c PATH] [-d PATH]
|
||||||
[--strategy-path PATH] [--dynamic-whitelist [INT]]
|
[-s NAME] [--strategy-path PATH] [--dynamic-whitelist [INT]]
|
||||||
[--db-url PATH]
|
[--db-url PATH] [--sd-notify]
|
||||||
{backtesting,edge,hyperopt} ...
|
{backtesting,edge,hyperopt} ...
|
||||||
|
|
||||||
Free, open source crypto trading bot
|
Free, open source crypto trading bot
|
||||||
@ -22,6 +22,7 @@ positional arguments:
|
|||||||
optional arguments:
|
optional arguments:
|
||||||
-h, --help show this help message and exit
|
-h, --help show this help message and exit
|
||||||
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
|
-v, --verbose Verbose mode (-vv for more, -vvv to get all messages).
|
||||||
|
--logfile FILE Log to the file specified
|
||||||
--version show program's version number and exit
|
--version show program's version number and exit
|
||||||
-c PATH, --config PATH
|
-c PATH, --config PATH
|
||||||
Specify configuration file (default: None). Multiple
|
Specify configuration file (default: None). Multiple
|
||||||
|
@ -70,6 +70,7 @@ Mandatory Parameters are marked as **Required**.
|
|||||||
| `strategy` | DefaultStrategy | Defines Strategy class to use.
|
| `strategy` | DefaultStrategy | Defines Strategy class to use.
|
||||||
| `strategy_path` | null | Adds an additional strategy lookup path (must be a folder).
|
| `strategy_path` | null | Adds an additional strategy lookup path (must be a folder).
|
||||||
| `internals.process_throttle_secs` | 5 | **Required.** Set the process throttle. Value in second.
|
| `internals.process_throttle_secs` | 5 | **Required.** Set the process throttle. Value in second.
|
||||||
|
| `logfile` | | Specify Logfile. Uses a rolling strategy of 10 files, with 1Mb per file.
|
||||||
| `internals.sd_notify` | false | Enables use of the sd_notify protocol to tell systemd service manager about changes in the bot state and issue keep-alive pings. See [here](installation.md#7-optional-configure-freqtrade-as-a-systemd-service) for more details.
|
| `internals.sd_notify` | false | Enables use of the sd_notify protocol to tell systemd service manager about changes in the bot state and issue keep-alive pings. See [here](installation.md#7-optional-configure-freqtrade-as-a-systemd-service) for more details.
|
||||||
|
|
||||||
### Parameters in the strategy
|
### Parameters in the strategy
|
||||||
|
@ -71,6 +71,13 @@ class Arguments(object):
|
|||||||
dest='loglevel',
|
dest='loglevel',
|
||||||
default=0,
|
default=0,
|
||||||
)
|
)
|
||||||
|
self.parser.add_argument(
|
||||||
|
'--logfile',
|
||||||
|
help='Log to the file specified',
|
||||||
|
dest='logfile',
|
||||||
|
type=str,
|
||||||
|
metavar='FILE'
|
||||||
|
)
|
||||||
self.parser.add_argument(
|
self.parser.add_argument(
|
||||||
'--version',
|
'--version',
|
||||||
action='version',
|
action='version',
|
||||||
|
@ -4,16 +4,18 @@ This module contains the configuration class
|
|||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
from argparse import Namespace
|
from argparse import Namespace
|
||||||
from typing import Any, Dict, Optional
|
from logging.handlers import RotatingFileHandler
|
||||||
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
import ccxt
|
import ccxt
|
||||||
from jsonschema import Draft4Validator, validate
|
from jsonschema import Draft4Validator, validate
|
||||||
from jsonschema.exceptions import ValidationError, best_match
|
from jsonschema.exceptions import ValidationError, best_match
|
||||||
|
|
||||||
from freqtrade import OperationalException, constants
|
from freqtrade import OperationalException, constants
|
||||||
from freqtrade.state import RunMode
|
|
||||||
from freqtrade.misc import deep_merge_dicts
|
from freqtrade.misc import deep_merge_dicts
|
||||||
|
from freqtrade.state import RunMode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -116,9 +118,22 @@ class Configuration(object):
|
|||||||
config.update({'verbosity': self.args.loglevel})
|
config.update({'verbosity': self.args.loglevel})
|
||||||
else:
|
else:
|
||||||
config.update({'verbosity': 0})
|
config.update({'verbosity': 0})
|
||||||
|
|
||||||
|
# Log to stdout, not stderr
|
||||||
|
log_handlers: List[logging.Handler] = [logging.StreamHandler(sys.stdout)]
|
||||||
|
if 'logfile' in self.args and self.args.logfile:
|
||||||
|
config.update({'logfile': self.args.logfile})
|
||||||
|
|
||||||
|
# Allow setting this as either configuration or argument
|
||||||
|
if 'logfile' in config:
|
||||||
|
log_handlers.append(RotatingFileHandler(config['logfile'],
|
||||||
|
maxBytes=1024 * 1024, # 1Mb
|
||||||
|
backupCount=10))
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO if config['verbosity'] < 1 else logging.DEBUG,
|
level=logging.INFO if config['verbosity'] < 1 else logging.DEBUG,
|
||||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||||
|
handlers=log_handlers
|
||||||
)
|
)
|
||||||
set_loggers(config['verbosity'])
|
set_loggers(config['verbosity'])
|
||||||
logger.info('Verbosity set to %s', config['verbosity'])
|
logger.info('Verbosity set to %s', config['verbosity'])
|
||||||
|
@ -5,6 +5,7 @@ import logging
|
|||||||
from argparse import Namespace
|
from argparse import Namespace
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from jsonschema import Draft4Validator, ValidationError, validate
|
from jsonschema import Draft4Validator, ValidationError, validate
|
||||||
@ -547,6 +548,23 @@ def test_set_loggers() -> None:
|
|||||||
assert logging.getLogger('telegram').level is logging.INFO
|
assert logging.getLogger('telegram').level is logging.INFO
|
||||||
|
|
||||||
|
|
||||||
|
def test_set_logfile(default_conf, mocker):
|
||||||
|
mocker.patch('freqtrade.configuration.open',
|
||||||
|
mocker.mock_open(read_data=json.dumps(default_conf)))
|
||||||
|
|
||||||
|
arglist = [
|
||||||
|
'--logfile', 'test_file.log',
|
||||||
|
]
|
||||||
|
args = Arguments(arglist, '').get_parsed_arg()
|
||||||
|
configuration = Configuration(args)
|
||||||
|
validated_conf = configuration.load_config()
|
||||||
|
|
||||||
|
assert validated_conf['logfile'] == "test_file.log"
|
||||||
|
f = Path("test_file.log")
|
||||||
|
assert f.is_file()
|
||||||
|
f.unlink()
|
||||||
|
|
||||||
|
|
||||||
def test_load_config_warn_forcebuy(default_conf, mocker, caplog) -> None:
|
def test_load_config_warn_forcebuy(default_conf, mocker, caplog) -> None:
|
||||||
default_conf['forcebuy_enable'] = True
|
default_conf['forcebuy_enable'] = True
|
||||||
mocker.patch('freqtrade.configuration.open', mocker.mock_open(
|
mocker.patch('freqtrade.configuration.open', mocker.mock_open(
|
||||||
|
Loading…
Reference in New Issue
Block a user