Deployed 7e7e475 to develop in en with MkDocs 1.6.1 and mike 2.1.4

This commit is contained in:
github-actions[bot]
2026-03-31 05:20:03 +00:00
parent df495f4472
commit 970aa93176
44 changed files with 13314 additions and 6959 deletions
+438 -166
View File
@@ -1461,6 +1461,145 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multiple-instances-using-docker" class="md-nav__link">
<span class="md-ellipsis">
Multiple instances using docker
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#use-a-different-database-system" class="md-nav__link">
<span class="md-ellipsis">
Use a different database system
</span>
</a>
<nav class="md-nav" aria-label="Use a different database system">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#postgresql" class="md-nav__link">
<span class="md-ellipsis">
PostgreSQL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mariadb-mysql" class="md-nav__link">
<span class="md-ellipsis">
MariaDB / MySQL
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configure-the-bot-running-as-a-systemd-service" class="md-nav__link">
<span class="md-ellipsis">
Configure the bot running as a systemd service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#advanced-logging" class="md-nav__link">
<span class="md-ellipsis">
Advanced Logging
</span>
</a>
<nav class="md-nav" aria-label="Advanced Logging">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#logging-to-syslog" class="md-nav__link">
<span class="md-ellipsis">
Logging to syslog
</span>
</a>
<nav class="md-nav" aria-label="Logging to syslog">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#syslog-usage" class="md-nav__link">
<span class="md-ellipsis">
Syslog usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#syslog-addressing" class="md-nav__link">
<span class="md-ellipsis">
Syslog addressing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#logging-to-journald" class="md-nav__link">
<span class="md-ellipsis">
Logging to journald
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#log-format-as-json" class="md-nav__link">
<span class="md-ellipsis">
Log format as JSON
</span>
</a>
</li>
</ul>
@@ -1903,6 +2042,145 @@
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#multiple-instances-using-docker" class="md-nav__link">
<span class="md-ellipsis">
Multiple instances using docker
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#use-a-different-database-system" class="md-nav__link">
<span class="md-ellipsis">
Use a different database system
</span>
</a>
<nav class="md-nav" aria-label="Use a different database system">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#postgresql" class="md-nav__link">
<span class="md-ellipsis">
PostgreSQL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mariadb-mysql" class="md-nav__link">
<span class="md-ellipsis">
MariaDB / MySQL
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#configure-the-bot-running-as-a-systemd-service" class="md-nav__link">
<span class="md-ellipsis">
Configure the bot running as a systemd service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#advanced-logging" class="md-nav__link">
<span class="md-ellipsis">
Advanced Logging
</span>
</a>
<nav class="md-nav" aria-label="Advanced Logging">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#logging-to-syslog" class="md-nav__link">
<span class="md-ellipsis">
Logging to syslog
</span>
</a>
<nav class="md-nav" aria-label="Logging to syslog">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#syslog-usage" class="md-nav__link">
<span class="md-ellipsis">
Syslog usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#syslog-addressing" class="md-nav__link">
<span class="md-ellipsis">
Syslog addressing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#logging-to-journald" class="md-nav__link">
<span class="md-ellipsis">
Logging to journald
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#log-format-as-json" class="md-nav__link">
<span class="md-ellipsis">
Log format as JSON
</span>
</a>
</li>
</ul>
@@ -1952,32 +2230,28 @@
For live trading mode, the default database will be <code>tradesv3.sqlite</code> and for dry-run it will be <code>tradesv3.dryrun.sqlite</code>.</p>
<p>The optional argument to the trade command used to specify the path of these files is <code>--db-url</code>, which requires a valid SQLAlchemy url.
So when you are starting a bot with only the config and strategy arguments in dry-run mode, the following 2 commands would have the same outcome.</p>
<p>``` bash
freqtrade trade -c MyConfig.json -s MyStrategy</p>
<h1 id="is-equivalent-to">is equivalent to<a class="headerlink" href="#is-equivalent-to" title="Permanent link">&para;</a></h1>
<p>freqtrade trade -c MyConfig.json -s MyStrategy --db-url sqlite:///tradesv3.dryrun.sqlite
```</p>
<div class="highlight"><pre><span></span><code>freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfig.json<span class="w"> </span>-s<span class="w"> </span>MyStrategy
<span class="c1"># is equivalent to</span>
freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfig.json<span class="w"> </span>-s<span class="w"> </span>MyStrategy<span class="w"> </span>--db-url<span class="w"> </span>sqlite:///tradesv3.dryrun.sqlite
</code></pre></div>
<p>It means that if you are running the trade command in two different terminals, for example to test your strategy both for trades in USDT and in another instance for trades in BTC, you will have to run them with different databases.</p>
<p>If you specify the URL of a database which does not exist, freqtrade will create one with the name you specified. So to test your custom strategy with BTC and USDT stake currencies, you could use the following commands (in 2 separate terminals):</p>
<p>``` bash</p>
<h1 id="terminal-1">Terminal 1:<a class="headerlink" href="#terminal-1" title="Permanent link">&para;</a></h1>
<p>freqtrade trade -c MyConfigBTC.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesBTC.dryrun.sqlite</p>
<h1 id="terminal-2">Terminal 2:<a class="headerlink" href="#terminal-2" title="Permanent link">&para;</a></h1>
<p>freqtrade trade -c MyConfigUSDT.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesUSDT.dryrun.sqlite
```</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Terminal 1:</span>
freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfigBTC.json<span class="w"> </span>-s<span class="w"> </span>MyCustomStrategy<span class="w"> </span>--db-url<span class="w"> </span>sqlite:///user_data/tradesBTC.dryrun.sqlite
<span class="c1"># Terminal 2:</span>
freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfigUSDT.json<span class="w"> </span>-s<span class="w"> </span>MyCustomStrategy<span class="w"> </span>--db-url<span class="w"> </span>sqlite:///user_data/tradesUSDT.dryrun.sqlite
</code></pre></div>
<p>Conversely, if you wish to do the same thing in production mode, you will also have to create at least one new database (in addition to the default one) and specify the path to the "live" databases, for example:</p>
<p>``` bash</p>
<h1 id="terminal-1_1">Terminal 1:<a class="headerlink" href="#terminal-1_1" title="Permanent link">&para;</a></h1>
<p>freqtrade trade -c MyConfigBTC.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesBTC.live.sqlite</p>
<h1 id="terminal-2_1">Terminal 2:<a class="headerlink" href="#terminal-2_1" title="Permanent link">&para;</a></h1>
<p>freqtrade trade -c MyConfigUSDT.json -s MyCustomStrategy --db-url sqlite:///user_data/tradesUSDT.live.sqlite
```</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Terminal 1:</span>
freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfigBTC.json<span class="w"> </span>-s<span class="w"> </span>MyCustomStrategy<span class="w"> </span>--db-url<span class="w"> </span>sqlite:///user_data/tradesBTC.live.sqlite
<span class="c1"># Terminal 2:</span>
freqtrade<span class="w"> </span>trade<span class="w"> </span>-c<span class="w"> </span>MyConfigUSDT.json<span class="w"> </span>-s<span class="w"> </span>MyCustomStrategy<span class="w"> </span>--db-url<span class="w"> </span>sqlite:///user_data/tradesUSDT.live.sqlite
</code></pre></div>
<p>For more information regarding usage of the sqlite databases, for example to manually enter or remove trades, please refer to the <a href="../sql_cheatsheet/">SQL Cheatsheet</a>.</p>
<h3 id="multiple-instances-using-docker">Multiple instances using docker<a class="headerlink" href="#multiple-instances-using-docker" title="Permanent link">&para;</a></h3>
<p>To run multiple instances of freqtrade using docker you will need to edit the docker-compose.yml file and add all the instances you want as separate services. Remember, you can separate your configuration into multiple files, so it's a good idea to think about making them modular, then if you need to edit something common to all bots, you can do that in a single config file.
``` yml</p>
<hr />
<p>version: '3'
<div class="highlight"><pre><span></span><code>---
version: &#39;3&#39;
services:
freqtrade1:
image: freqtradeorg/freqtrade:stable
@@ -1987,25 +2261,26 @@ services:
# Build step - only needed when additional dependencies are needed
# build:
# context: .
# dockerfile: "./docker/Dockerfile.custom"
# dockerfile: &quot;./docker/Dockerfile.custom&quot;
restart: always
container_name: freqtrade1
volumes:
- "./user_data:/freqtrade/user_data"
- &quot;./user_data:/freqtrade/user_data&quot;
# Expose api on port 8080 (localhost only)
# Please read the <a href="https://www.freqtrade.io/en/stable/rest-api/">https://www.freqtrade.io/en/stable/rest-api/</a> documentation
# Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8080:8080"
# Default command used when running <code>docker compose up</code>
- &quot;127.0.0.1:8080:8080&quot;
# Default command used when running `docker compose up`
command: &gt;
trade
--logfile /freqtrade/user_data/logs/freqtrade1.log
--db-url sqlite:////freqtrade/user_data/tradesv3_freqtrade1.sqlite
--config /freqtrade/user_data/config.json
--config /freqtrade/user_data/config.freqtrade1.json
--strategy SampleStrategy</p>
<p>freqtrade2:
--strategy SampleStrategy
freqtrade2:
image: freqtradeorg/freqtrade:stable
# image: freqtradeorg/freqtrade:develop
# Use plotting image
@@ -2013,25 +2288,25 @@ services:
# Build step - only needed when additional dependencies are needed
# build:
# context: .
# dockerfile: "./docker/Dockerfile.custom"
# dockerfile: &quot;./docker/Dockerfile.custom&quot;
restart: always
container_name: freqtrade2
volumes:
- "./user_data:/freqtrade/user_data"
- &quot;./user_data:/freqtrade/user_data&quot;
# Expose api on port 8080 (localhost only)
# Please read the <a href="https://www.freqtrade.io/en/stable/rest-api/">https://www.freqtrade.io/en/stable/rest-api/</a> documentation
# Please read the https://www.freqtrade.io/en/stable/rest-api/ documentation
# before enabling this.
ports:
- "127.0.0.1:8081:8080"
# Default command used when running <code>docker compose up</code>
- &quot;127.0.0.1:8081:8080&quot;
# Default command used when running `docker compose up`
command: &gt;
trade
--logfile /freqtrade/user_data/logs/freqtrade2.log
--db-url sqlite:////freqtrade/user_data/tradesv3_freqtrade2.sqlite
--config /freqtrade/user_data/config.json
--config /freqtrade/user_data/config.freqtrade2.json
--strategy SampleStrategy</p>
<p>```</p>
--strategy SampleStrategy
</code></pre></div></p>
<p>You can use whatever naming convention you want, freqtrade1 and 2 are arbitrary. Note, that you will need to use different database files, port mappings and telegram configurations for each instance, as mentioned above. </p>
<h2 id="use-a-different-database-system">Use a different database system<a class="headerlink" href="#use-a-different-database-system" title="Permanent link">&para;</a></h2>
<p>Freqtrade is using SQLAlchemy, which supports multiple different database systems. As such, a multitude of database systems should be supported.
@@ -2066,11 +2341,11 @@ Freqtrade does not depend or install any additional database driver. Please refe
<p>Certain systems (like Raspbian) don't load service unit files from the user directory. In this case, copy <code>freqtrade.service</code> into <code>/etc/systemd/user/</code> (requires superuser permissions).</p>
</div>
<p>After that you can start the daemon with:</p>
<p><code>bash
systemctl --user start freqtrade</code></p>
<div class="highlight"><pre><span></span><code>systemctl<span class="w"> </span>--user<span class="w"> </span>start<span class="w"> </span>freqtrade
</code></pre></div>
<p>For this to be persistent (run when user is logged out) you'll need to enable <code>linger</code> for your freqtrade user.</p>
<p><code>bash
sudo loginctl enable-linger "$USER"</code></p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>loginctl<span class="w"> </span>enable-linger<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$USER</span><span class="s2">&quot;</span>
</code></pre></div>
<p>If you run the bot as a service, you can use systemd service manager as a software watchdog monitoring freqtrade bot
state and restarting it in the case of failures. If the <code>internals.sd_notify</code> parameter is set to true in the
configuration or the <code>--sd-notify</code> command line option is used, the bot will send keep-alive ping messages to systemd
@@ -2090,40 +2365,40 @@ Using <code>--logfile logfile.log</code> will enable the RotatingFileHandler.</p
<p>If you're not content with the log format, or with the default settings provided for the RotatingFileHandler, you can customize logging to your liking by adding the <code>log_config</code> configuration to your freqtrade configuration file(s).</p>
<p>The default configuration looks roughly like the below, with the file handler being provided but not enabled as the <code>filename</code> is commented out.
Uncomment this line and supply a valid path/filename to enable it.</p>
<p><code>json hl_lines="5-7 13-16 27"
{
"log_config": {
"version": 1,
"formatters": {
"basic": {
"format": "%(message)s"
},
"standard": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
"console": {
"class": "freqtrade.loggers.ft_rich_handler.FtRichHandler",
"formatter": "basic"
},
"file": {
"class": "logging.handlers.RotatingFileHandler",
"formatter": "standard",
// "filename": "someRandomLogFile.log",
"maxBytes": 10485760,
"backupCount": 10
}
},
"root": {
"handlers": [
"console",
// "file"
],
"level": "INFO",
}
}
}</code></p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;log_config&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="nt">&quot;basic&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span class="hll"><span class="w"> </span><span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;%(message)s&quot;</span>
</span><span class="hll"><span class="w"> </span><span class="p">},</span>
</span><span class="w"> </span><span class="nt">&quot;standard&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;%(asctime)s - %(name)s - %(levelname)s - %(message)s&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="hll"><span class="w"> </span><span class="nt">&quot;console&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span class="hll"><span class="w"> </span><span class="nt">&quot;class&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;freqtrade.loggers.ft_rich_handler.FtRichHandler&quot;</span><span class="p">,</span>
</span><span class="hll"><span class="w"> </span><span class="nt">&quot;formatter&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;basic&quot;</span>
</span><span class="hll"><span class="w"> </span><span class="p">},</span>
</span><span class="w"> </span><span class="nt">&quot;file&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;class&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;logging.handlers.RotatingFileHandler&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatter&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;standard&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="c1">// &quot;filename&quot;: &quot;someRandomLogFile.log&quot;,</span>
<span class="w"> </span><span class="nt">&quot;maxBytes&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;backupCount&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;root&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="hll"><span class="w"> </span><span class="s2">&quot;console&quot;</span><span class="p">,</span>
</span><span class="w"> </span><span class="c1">// &quot;file&quot;</span>
<span class="w"> </span><span class="p">],</span>
<span class="w"> </span><span class="nt">&quot;level&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;INFO&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<div class="admonition note">
<p class="admonition-title">highlighted lines</p>
<p>Highlighted lines in the above code-block define the Rich handler and belong together.
@@ -2140,36 +2415,35 @@ If this section is left out, freqtrade will provide no output (in the non-config
<p>On many Linux systems the bot can be configured to send its log messages to <code>syslog</code> or <code>journald</code> system services. Logging to a remote <code>syslog</code> server is also available on Windows. The special values for the <code>--logfile</code> command line option can be used for this.</p>
<h3 id="logging-to-syslog">Logging to syslog<a class="headerlink" href="#logging-to-syslog" title="Permanent link">&para;</a></h3>
<p>To send Freqtrade log messages to a local or remote <code>syslog</code> service use the <code>"log_config"</code> setup option to configure logging.</p>
<p>``` json
{
// ...
"log_config": {
"version": 1,
"formatters": {
"syslog_fmt": {
"format": "%(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
// Other handlers?
"syslog": {
"class": "logging.handlers.SysLogHandler",
"formatter": "syslog_fmt",
// Use one of the other options above as address instead?
"address": "/dev/log"
}
},
"root": {
"handlers": [
// other handlers
"syslog",</p>
<div class="codehilite"><pre><span></span><code> ]
}
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="c1">// ...</span>
<span class="w"> </span><span class="nt">&quot;log_config&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;syslog_fmt&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;%(name)s - %(levelname)s - %(message)s&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Other handlers? </span>
<span class="w"> </span><span class="nt">&quot;syslog&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;class&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;logging.handlers.SysLogHandler&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatter&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;syslog_fmt&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="c1">// Use one of the other options above as address instead? </span>
<span class="w"> </span><span class="nt">&quot;address&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;/dev/log&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;root&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="c1">// other handlers</span>
<span class="w"> </span><span class="s2">&quot;syslog&quot;</span><span class="p">,</span>
<p>}
}
```</p>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p><a href="#advanced-logging">Additional log-handlers</a> may need to be configured to for example also have log output in the console.</p>
<h4 id="syslog-usage">Syslog usage<a class="headerlink" href="#syslog-usage" title="Permanent link">&para;</a></h4>
<p>Log messages are send to <code>syslog</code> with the <code>user</code> facility. So you can see them with the following commands:</p>
@@ -2179,13 +2453,13 @@ If this section is left out, freqtrade will provide no output (in the non-config
</ul>
<p>On many systems <code>syslog</code> (<code>rsyslog</code>) fetches data from <code>journald</code> (and vice versa), so both syslog or journald can be used and the messages be viewed with both <code>journalctl</code> and a syslog viewer utility. You can combine this in any way which suites you better.</p>
<p>For <code>rsyslog</code> the messages from the bot can be redirected into a separate dedicated log file. To achieve this, add</p>
<p><code>if $programname startswith "freqtrade" then -/var/log/freqtrade.log</code></p>
<div class="highlight"><pre><span></span><code>if $programname startswith &quot;freqtrade&quot; then -/var/log/freqtrade.log
</code></pre></div>
<p>to one of the rsyslog configuration files, for example at the end of the <code>/etc/rsyslog.d/50-default.conf</code>.</p>
<p>For <code>syslog</code> (<code>rsyslog</code>), the reduction mode can be switched on. This will reduce the number of repeating messages. For instance, multiple bot Heartbeat messages will be reduced to a single message when nothing else happens with the bot. To achieve this, set in <code>/etc/rsyslog.conf</code>:</p>
<p>```</p>
<h1 id="filter-duplicated-messages">Filter duplicated messages<a class="headerlink" href="#filter-duplicated-messages" title="Permanent link">&para;</a></h1>
<p>$RepeatedMsgReduction on
```</p>
<div class="highlight"><pre><span></span><code># Filter duplicated messages
$RepeatedMsgReduction on
</code></pre></div>
<h4 id="syslog-addressing">Syslog addressing<a class="headerlink" href="#syslog-addressing" title="Permanent link">&para;</a></h4>
<p>The syslog address can be either a Unix domain socket (socket filename) or a UDP socket specification, consisting of IP address and UDP port, separated by the <code>:</code> character.</p>
<p>So, the following are the examples of possible addresses:</p>
@@ -2211,34 +2485,33 @@ If this section is left out, freqtrade will provide no output (in the non-config
<h3 id="logging-to-journald">Logging to journald<a class="headerlink" href="#logging-to-journald" title="Permanent link">&para;</a></h3>
<p>This needs the <code>cysystemd</code> python package installed as dependency (<code>pip install cysystemd</code>), which is not available on Windows. Hence, the whole journald logging functionality is not available for a bot running on Windows.</p>
<p>To send Freqtrade log messages to <code>journald</code> system service, add the following configuration snippet to your configuration.</p>
<p>``` json
{
// ...
"log_config": {
"version": 1,
"formatters": {
"journald_fmt": {
"format": "%(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
// Other handlers?
"journald": {
"class": "cysystemd.journal.JournaldLogHandler",
"formatter": "journald_fmt",
}
},
"root": {
"handlers": [
// ..
"journald",</p>
<div class="codehilite"><pre><span></span><code> ]
}
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="c1">// ...</span>
<span class="w"> </span><span class="nt">&quot;log_config&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;journald_fmt&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;format&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;%(name)s - %(levelname)s - %(message)s&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Other handlers? </span>
<span class="w"> </span><span class="nt">&quot;journald&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;class&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;cysystemd.journal.JournaldLogHandler&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatter&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;journald_fmt&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;root&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="c1">// .. </span>
<span class="w"> </span><span class="s2">&quot;journald&quot;</span><span class="p">,</span>
<p>}
}
```</p>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p><a href="#advanced-logging">Additional log-handlers</a> may need to be configured to for example also have log output in the console.</p>
<p>Log messages are send to <code>journald</code> with the <code>user</code> facility. So you can see them with the following commands:</p>
<ul>
@@ -2257,40 +2530,39 @@ If this section is left out, freqtrade will provide no output (in the non-config
The "fmt_dict" attribute defines the keys for the json output - as well as the <a href="https://docs.python.org/3/library/logging.html#logrecord-attributes">python logging LogRecord attributes</a>.</p>
<p>The below configuration will change the default output to JSON. The same formatter could however also be used in combination with the <code>RotatingFileHandler</code>.
We recommend to keep one format in human readable form.</p>
<p>``` json
{
// ...
"log_config": {
"version": 1,
"formatters": {
"json": {
"()": "freqtrade.loggers.json_formatter.JsonFormatter",
"fmt_dict": {
"timestamp": "asctime",
"level": "levelname",
"logger": "name",
"message": "message"
}
}
},
"handlers": {
// Other handlers?
"jsonStream": {
"class": "logging.StreamHandler",
"formatter": "json"
}
},
"root": {
"handlers": [
// ..
"jsonStream",</p>
<div class="codehilite"><pre><span></span><code> ]
}
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="c1">// ...</span>
<span class="w"> </span><span class="nt">&quot;log_config&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;version&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;json&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;()&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;freqtrade.loggers.json_formatter.JsonFormatter&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;fmt_dict&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;timestamp&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;asctime&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;level&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;levelname&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;logger&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;name&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;message&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;message&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// Other handlers? </span>
<span class="w"> </span><span class="nt">&quot;jsonStream&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;class&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;logging.StreamHandler&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;formatter&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;json&quot;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">},</span>
<span class="w"> </span><span class="nt">&quot;root&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;handlers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w"> </span><span class="c1">// .. </span>
<span class="w"> </span><span class="s2">&quot;jsonStream&quot;</span><span class="p">,</span>
<p>}
}
```</p>
<span class="w"> </span><span class="p">]</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>