<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ramdyne (Posts about syslog)</title><link>https://www.ramdyne.nl/</link><description></description><atom:link href="https://www.ramdyne.nl/categories/syslog.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Sat, 07 Mar 2026 00:09:01 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>python and the logger</title><link>https://www.ramdyne.nl/posts/python-and-the-logger/</link><dc:creator>ramdyne</dc:creator><description>&lt;p&gt;I've been working with logging in Python for the last few weeks. For some reason I ended up
having to log to a MySQL (MariaDB?) server and I hadn't done that before. Turns out that a
lot of people want to log &lt;em&gt;MySQL queries&lt;/em&gt; to the same logging server as Python, but not a
lot of people want to log &lt;em&gt;to&lt;/em&gt; a MySQL server. The
&lt;a class="reference external" href="https://docs.python.org/3/howto/logging.html"&gt;Python logger&lt;/a&gt; is actually quite a
nicely documented piece of software if your needs are basic, but want something more and
you might end up between a suggestion and a hard place...&lt;/p&gt;
&lt;p&gt;Next to logging to MySQL I also wanted to configure the loger using code, &lt;em&gt;not&lt;/em&gt; an ini
file or a YAML file. Enter DictConfig. The example in the documentation is &lt;em&gt;massive&lt;/em&gt;, does
much more than anyone needs and is too complicated for when you are starting out with
logging. So here's a basic example:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-1" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-1" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;logging_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-2" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-2" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-2"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-3" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-3" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-3"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'disable_existing_loggers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-4" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-4" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-4"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'formatters'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-5" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-5" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-5"&gt;&lt;/a&gt;        &lt;span class="s1"&gt;'standard'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-6" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-6" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-6"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'format'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="si"&gt;%(asctime)s&lt;/span&gt;&lt;span class="s1"&gt; [&lt;/span&gt;&lt;span class="si"&gt;%(levelname)s&lt;/span&gt;&lt;span class="s1"&gt;] &lt;/span&gt;&lt;span class="si"&gt;%(name)s&lt;/span&gt;&lt;span class="s1"&gt;: &lt;/span&gt;&lt;span class="si"&gt;%(message)s&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-7" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-7" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-7"&gt;&lt;/a&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-8" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-8" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-8"&gt;&lt;/a&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-9" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-9" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-9"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'handlers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-10" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-10" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-10"&gt;&lt;/a&gt;        &lt;span class="s1"&gt;'default_handler'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-11" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-11" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-11"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'level'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'DEBUG'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-12" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-12" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-12"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'formatter'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'standard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-13" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-13" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-13"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'class'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'logging.StreamHandler'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-14" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-14" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-14"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'stream'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ext://sys.stdout'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-15" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-15" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-15"&gt;&lt;/a&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-16" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-16" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-16"&gt;&lt;/a&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-17" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-17" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-17"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'loggers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-18" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-18" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-18"&gt;&lt;/a&gt;        &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-19" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-19" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-19"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'level'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'NOTSET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-20" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-20" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-20"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'handlers'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'default_handler'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-21" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-21" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-21"&gt;&lt;/a&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-22" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-22" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-22"&gt;&lt;/a&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-23" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-23" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-23"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-24" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-24" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-24"&gt;&lt;/a&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-25" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-25" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-25"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;logging.config&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-26" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-26" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-26"&gt;&lt;/a&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dictConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging_config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-27" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-27" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-27"&gt;&lt;/a&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-28" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-28" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-28"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Now you can use logger to log&lt;/span&gt;
&lt;a id="rest_code_684495a83d6046d0ae0430a46fdb7d8d-29" name="rest_code_684495a83d6046d0ae0430a46fdb7d8d-29" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_684495a83d6046d0ae0430a46fdb7d8d-29"&gt;&lt;/a&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Panic'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should be sufficient for a simple logger to stdout (the CLI, console, DOS box whatever
you call it). See the documentation if you want to change something or make it more
complicated.&lt;/p&gt;
&lt;p&gt;When you want to log to a MySQL database, you need to write your own custom handler class,
inheriting from logging.Handler. Or you could google for an existing MySQLHandler, like
&lt;a class="reference external" href="https://github.com/onemoretime/mySQLHandler"&gt;this one I found on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I did bring that handler up to Python 3 specs, and followed whatever Pycharm wanted me to
fix on this code.&lt;/p&gt;
&lt;p&gt;The one "big" thing I did, was to change the constructor of the handler class to the following:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_a28bf4a27bc841b7b64b59530984908d-1" name="rest_code_a28bf4a27bc841b7b64b59530984908d-1" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_a28bf4a27bc841b7b64b59530984908d-1"&gt;&lt;/a&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db_user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db_password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_a28bf4a27bc841b7b64b59530984908d-2" name="rest_code_a28bf4a27bc841b7b64b59530984908d-2" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_a28bf4a27bc841b7b64b59530984908d-2"&gt;&lt;/a&gt;    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'll leave the implementation of this function up to you, but the signature is really important
when you want to use this custom handler in combination with DictConfig.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-1" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-1" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-1"&gt;&lt;/a&gt;&lt;span class="n"&gt;logging_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-2" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-2" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-2"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'version'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-3" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-3" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-3"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'disable_existing_loggers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-4" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-4" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-4"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'handlers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-5" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-5" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-5"&gt;&lt;/a&gt;        &lt;span class="s1"&gt;'default_handler'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-6" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-6" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-6"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'class'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'my_custom_handler.MyCustomHandler'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-7" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-7" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-7"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'level'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'DEBUG'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-8" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-8" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-8"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'formatter'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'standard'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-9" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-9" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-9"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-10" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-10" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-10"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'port'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3306&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-11" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-11" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-11"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'db_user'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-12" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-12" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-12"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'db_password'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-13" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-13" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-13"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'db_name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Log"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-14" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-14" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-14"&gt;&lt;/a&gt;        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-15" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-15" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-15"&gt;&lt;/a&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-16" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-16" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-16"&gt;&lt;/a&gt;    &lt;span class="s1"&gt;'loggers'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-17" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-17" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-17"&gt;&lt;/a&gt;        &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-18" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-18" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-18"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'level'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'NOTSET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-19" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-19" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-19"&gt;&lt;/a&gt;            &lt;span class="s1"&gt;'handlers'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'default_handler'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-20" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-20" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-20"&gt;&lt;/a&gt;        &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-21" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-21" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-21"&gt;&lt;/a&gt;    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-22" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-22" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-22"&gt;&lt;/a&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-23" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-23" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-23"&gt;&lt;/a&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-24" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-24" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-24"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;logging.config&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-25" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-25" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-25"&gt;&lt;/a&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dictConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging_config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-26" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-26" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-26"&gt;&lt;/a&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-27" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-27" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-27"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Now you can use logger to log&lt;/span&gt;
&lt;a id="rest_code_7028fe05031049f0b178a66fdbeda1b4-28" name="rest_code_7028fe05031049f0b178a66fdbeda1b4-28" href="https://www.ramdyne.nl/posts/python-and-the-logger/#rest_code_7028fe05031049f0b178a66fdbeda1b4-28"&gt;&lt;/a&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Panic'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The custom handler in this example has the class name MyCustomhandler and can be found in the
my_custom_handler module. As you can see the parameters for a custom handler in DictConfig reflect the
parameters of the constructor of the custom handler. Note also that a database handler doesn't really
need a formatter when your datastructure looks like &lt;a class="reference external" href="https://docs.python.org/3/library/logging.html#logrecord-attributes"&gt;the format of log messages&lt;/a&gt;.&lt;/p&gt;</description><category>customizing</category><category>handlers</category><category>logging</category><category>mysql</category><category>python</category><category>syslog</category><guid>https://www.ramdyne.nl/posts/python-and-the-logger/</guid><pubDate>Sun, 11 Apr 2021 20:44:24 GMT</pubDate></item></channel></rss>