{
  "source_file": "0930",
  "source_platform": "Medium",
  "author": "Kurtis Pykes",
  "title_listed": "How To Do Logging in Python",
  "keywords": "logging,Python,调试",
  "domain": "数据处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "部分免费/会员墙",
  "url": "https://towardsdatascience.com/how-to-do-logging-in-python-37fee87b718c/",
  "publish_date": "2022-05",
  "corpus_stage": "预训练/SFT",
  "notes": "",
  "id": "f843de180930",
  "collected_at": "2026-10-01T23:48:45",
  "title": "How To Do Logging in Python | Towards Data Science",
  "body_markdown": "![Revisit consent button](https://cdn-cookieyes.com/assets/images/revisit.svg)\nWe value your privacy\nWe use cookies to enhance your browsing experience, serve personalised ads or content, and analyse our traffic. By clicking \"Accept All\", you consent to our use of cookies.\nCustomise Reject All Accept All\nCustomise Consent Preferences ![](https://cdn-cookieyes.com/assets/images/close.svg)\nWe use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.\nThe cookies that are categorised as \"Necessary\" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... Show more\nNecessaryAlways Active\nNecessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.\n  * Cookie\nBCTempID\n  * Duration\n10 minutes\n  * Description\nNo description available.\n\n\n  * Cookie\n__cf_bm\n  * Duration\n1 hour\n  * Description\nThis cookie, set by Cloudflare, is used to support Cloudflare Bot Management. \n\n\n  * Cookie\nAWSALBCORS\n  * Duration\n7 days\n  * Description\nAmazon Web Services set this cookie for load balancing.\n\n\n  * Cookie\n_cfuvid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to track users across sessions to optimize user experience by maintaining session consistency and providing personalized services\n\n\n  * Cookie\nli_gc\n  * Duration\n6 months\n  * Description\nLinkedin set this cookie for storing visitor's consent regarding using cookies for non-essential purposes.\n\n\n  * Cookie\n__hssrc\n  * Duration\nsession\n  * Description\nThis cookie is set by Hubspot whenever it changes the session cookie. The __hssrc cookie set to 1 indicates that the user has restarted the browser, and if the cookie does not exist, it is assumed to be a new session.\n\n\n  * Cookie\n__hssc\n  * Duration\n1 hour\n  * Description\nHubSpot sets this cookie to keep track of sessions and to determine if HubSpot should increment the session number and timestamps in the __hstc cookie.\n\n\n  * Cookie\nwpEmojiSettingsSupports\n  * Duration\nsession\n  * Description\nWordPress sets this cookie when a user interacts with emojis on a WordPress site. It helps determine if the user's browser can display emojis properly.\n\n\n  * Cookie\nBCSessionID\n  * Duration\n1 year 1 month 4 days\n  * Description\nBlueconic sets this cookie as a unique identifier for the BlueConic profile.\n\n\n  * Cookie\n_octo\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nlogged_in\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\n__Secure-YEC\n  * Duration\npast\n  * Description\nYouTube sets this cookie to stores the user's video player preferences using embedded YouTube video\n\n\n  * Cookie\n__eoi\n  * Duration\n6 months\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTGCORS\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\nlogin-status-p\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nAWSALBTG\n  * Duration\n7 days\n  * Description\nNo description available.\n\n\n  * Cookie\ncsrf_token\n  * Duration\nsession\n  * Description\nNo description available.\n\n\n  * Cookie\ntoken_v2\n  * Duration\n1 day\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nD\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nPHPSESSID\n  * Duration\nsession\n  * Description\nThis cookie is native to PHP applications. The cookie stores and identifies a user's unique session ID to manage user sessions on the website. The cookie is a session cookie and will be deleted when all the browser windows are closed.\n\n\n  * Cookie\nVISITOR_PRIVACY_METADATA\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to store the user's cookie consent state for the current domain. \n\n\n  * Cookie\ncookietest\n  * Duration\nsession\n  * Description\nThe cookietest cookie is typically used to determine whether the user's browser accepts cookies, essential for website functionality and user experience.\n\n\n  * Cookie\n__Host-airtable-session\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\n__Host-airtable-session.sig\n  * Duration\n1 year\n  * Description\nThis cookie is used to enable us to integrate the services of Airtable.\n\n\n  * Cookie\nm\n  * Duration\n1 year 1 month 4 days\n  * Description\nStripe sets this cookie for fraud prevention purposes. It identifies the device used to access the website, allowing the website to be formatted accordingly.\n\n\n  * Cookie\nBIGipServer*\n  * Duration\nsession\n  * Description\nMarketo sets this cookie to collect information about the user's online activity and build a profile about their interests to provide advertisements relevant to the user. \n\n\n  * Cookie\n__cfruid\n  * Duration\nsession\n  * Description\nCloudflare sets this cookie to identify trusted web traffic.\n\n\n  * Cookie\n_GRECAPTCHA\n  * Duration\n6 months\n  * Description\nGoogle Recaptcha service sets this cookie to identify bots to protect the website against malicious spam attacks.\n\n\n  * Cookie\n__Secure-YNID\n  * Duration\n6 months\n  * Description\nGoogle cookie used to protect user security and prevent fraud, especially during the login process.\n\n\n  * Cookie\ncookieyes-consent\n  * Duration\n1 year\n  * Description\nCookieYes sets this cookie to remember users' consent preferences so that their preferences are respected on subsequent visits to this site. It does not collect or store any personal information about the site visitors.\n\n\nFunctional\nFunctional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.\n  * Cookie\nlidc\n  * Duration\n1 day\n  * Description\nLinkedIn sets the lidc cookie to facilitate data center selection.\n\n\n  * Cookie\nbrw\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nbrwConsent\n  * Duration\n5 minutes\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nWMF-Uniq\n  * Duration\n1 year\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nloom_anon_comment\n  * Duration\n1 year\n  * Description\nNo description available.\n\n\n  * Cookie\nloom_referral_video\n  * Duration\nsession\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nVISITOR_INFO1_LIVE\n  * Duration\n6 months\n  * Description\nA cookie set by YouTube to measure bandwidth that determines whether the user gets the new or old player interface.\n\n\n  * Cookie\nyt-remote-connected-devices\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nytidb::LAST_RESULT_ENTRY_KEY\n  * Duration\nNever Expires\n  * Description\nThe cookie ytidb::LAST_RESULT_ENTRY_KEY is used by YouTube to store the last search result entry that was clicked by the user. This information is used to improve the user experience by providing more relevant search results in the future.\n\n\n  * Cookie\nyt-remote-device-id\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to store the user's video preferences using embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-name\n  * Duration\nsession\n  * Description\nThe yt-remote-session-name cookie is used by YouTube to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\nyt-remote-fast-check-period\n  * Duration\nsession\n  * Description\nThe yt-remote-fast-check-period cookie is used by YouTube to store the user's video player preferences for embedded YouTube videos.\n\n\n  * Cookie\nyt-remote-session-app\n  * Duration\nsession\n  * Description\nThe yt-remote-session-app cookie is used by YouTube to store user preferences and information about the interface of the embedded YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-available\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-available cookie is used to store the user's preferences regarding whether casting is available on their YouTube video player.\n\n\n  * Cookie\nyt-remote-cast-installed\n  * Duration\nsession\n  * Description\nThe yt-remote-cast-installed cookie is used to store the user's video player preferences using embedded YouTube video.\n\n\n  * Cookie\ncp_session\n  * Duration\n3 months\n  * Description\nCodepen sets this cookie for Help systems found in the website.\n\n\n  * Cookie\nloid\n  * Duration\n1 year 1 month 4 days\n  * Description\nThis cookie is set by the Reddit. The cookie enables the sharing of content from the website onto the social media platform.\n\n\nAnalytics\nAnalytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.\n  * Cookie\n__hstc\n  * Duration\n6 months\n  * Description\nHubspot set this main cookie for tracking visitors. It contains the domain, initial timestamp (first visit), last timestamp (last visit), current timestamp (this visit), and session number (increments for each subsequent session).\n\n\n  * Cookie\nhubspotutk\n  * Duration\n6 months\n  * Description\nHubSpot sets this cookie to keep track of the visitors to the website. This cookie is passed to HubSpot on form submission and used when deduplicating contacts.\n\n\n  * Cookie\n_ga\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to calculate visitor, session and campaign data and track site usage for the site's analytics report. The cookie stores information anonymously and assigns a randomly generated number to recognise unique visitors.\n\n\n  * Cookie\n_ga_*\n  * Duration\n1 year 1 month 4 days\n  * Description\nGoogle Analytics sets this cookie to store and count page views.\n\n\n  * Cookie\n__Host-psifi.analyticsTrace\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n__Host-psifi.analyticsTraceV2\n  * Duration\n6 hours\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\n_gh_sess\n  * Duration\nsession\n  * Description\nGitHub sets this cookie for temporary application and framework state between pages like what step the user is on in a multiple step form.\n\n\n  * Cookie\nYSC\n  * Duration\nsession\n  * Description\nYSC cookie is set by Youtube and is used to track the views of embedded videos on Youtube pages.\n\n\n  * Cookie\najs_anonymous_id\n  * Duration\n1 year\n  * Description\nThis cookie is set by Segment to count the number of people who visit a certain site by tracking if they have visited before.\n\n\n  * Cookie\nvuid\n  * Duration\n1 year 1 month 4 days\n  * Description\nVimeo installs this cookie to collect tracking information by setting a unique ID to embed videos on the website. \n\n\nPerformance\nPerformance cookies are used to understand and analyse the key performance indexes of the website which helps in delivering a better user experience for the visitors.\n  * Cookie\nAWSALB\n  * Duration\n7 days\n  * Description\nAWSALB is an application load balancer cookie set by Amazon Web Services to map the session to the target.\n\n\n  * Cookie\nacq\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nacq.sig\n  * Duration\npast\n  * Description\nDescription is currently not available.\n\n\n  * Cookie\nptc\n  * Duration\n2 years\n  * Description\nNo description available.\n\n\nAdvertisement\nAdvertisement cookies are used to provide visitors with customised advertisements based on the pages you visited previously and to analyse the effectiveness of the ad campaigns.\n  * Cookie\nmuc_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to collect user behaviour and interaction data to optimize the website.\n\n\n  * Cookie\nguest_id_marketing\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\nguest_id_ads\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor.\n\n\n  * Cookie\npersonalization_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to integrate and share features for social media and also store information about how the user uses the website, for tracking and targeting.\n\n\n  * Cookie\nguest_id\n  * Duration\n1 year 1 month 4 days\n  * Description\nTwitter sets this cookie to identify and track the website visitor. It registers if a user is signed in to the Twitter platform and collects information about ad preferences.\n\n\n  * Cookie\nbcookie\n  * Duration\n1 year\n  * Description\nLinkedIn sets this cookie from LinkedIn share buttons and ad tags to recognize browser IDs.\n\n\n  * Cookie\n__Secure-ROLLOUT_TOKEN\n  * Duration\n6 months\n  * Description\nYouTube sets this cookie to manage feature rollout and experimentation. It helps Google control which new features or interface changes are shown to users as part of testing and staged rollouts, ensuring consistent experience for a given user during an experiment.\n\n\n  * Cookie\nyt.innertube::nextId\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nyt.innertube::requests\n  * Duration\nNever Expires\n  * Description\nYouTube sets this cookie to register a unique ID to store data on what videos from YouTube the user has seen.\n\n\n  * Cookie\nsession_tracker\n  * Duration\nsession\n  * Description\nThis cookie is set by the Reddit. This cookie is used to identify trusted web traffic. It also helps in adverstising on the website.\n\n\n  * Cookie\nedgebucket\n  * Duration\nsession\n  * Description\nReddit sets this cookie to save the information about a log-on Reddit user, for the purpose of advertisement recommendations and updating the content.\n\n\n  * Cookie\ndid\n  * Duration\n1 year\n  * Description\nArbor sets this cookie to show targeted ads to site visitors.This cookie expires after 2 months or 1 year.\n\n\nUncategorised\nOther uncategorised cookies are those that are being analysed and have not been classified into a category as yet.\nNo cookies to display.\nReject All Save My Preferences Accept All\nToggle Search[](https://towardsdatascience.com/)Toggle Mobile Navigation\n[](https://towardsdatascience.com/)\nPublish AI, ML & data-science insights to a global community of data professionals.\nSign in[Submit an Article](https://write.insightmediagroup.io)\n[Latest](https://towardsdatascience.com/latest/)[Editor's Picks](https://towardsdatascience.com/tag/editors-pick/)[Newsletter](https://towardsdatascience.com/tag/the-variable/)[ShipAI](https://towardsdatascience.com/shipai/)\n* * *\n[Write For TDS](https://towardsdatascience.com/submissions/)\n[LinkedIn](https://www.linkedin.com/company/towards-data-science/)[X](https://x.com/TDataScience)Toggle Search\n[Programming](https://towardsdatascience.com/category/programming/)\n# How To Do Logging in Python\nTracking Events In Your Program\n[Kurtis Pykes](https://towardsdatascience.com/author/kurtispykes/)\nMay 17, 20227 min read\n![Photo by Viktor Talashuk on Unsplash](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/05/0ODv4swqwS_0_3bYc-scaled.jpg)\nPhoto by [Viktor Talashuk](https://unsplash.com/@viktortalashuk?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)\nOne of the most used functions in the Python programming language is the `print()` statement; `print()` is one of the first functions you'll cover when learning Python. In terms of functionality, there isn't anything that comes close. But it shouldn't be used for all instances like when you're debugging - especially if you're working on a complex program.\nYou may get away with using `print()` statements in a simple program, but I personally wouldn't advise it. You're better off getting into the habit of using logs to debug your code. Logging is one of the most useful tools in a programmer's toolbox. It's used as an aid to better understand the flow of a program and identify scenarios that may not have been considered while the program was being developed.\nPython provides us with a built-in logging module called `logging`. In this article, we will cover important concepts that will allow you to begin adding `logging` to your applications.\ntext\n\n```\nTable of contents: \n--> A simple introduction to Python's logging module\n--> Configuring the logger\n--> Creating your own logger object\n--> Understanding when to use logging\n```\n\nLearn this step by step with the interactive [Computer Science](https://roadmap.sh/computer-science) roadmap.\n## A simple introduction to Python's logging module\nA log is an auto-produced, timestamped documentation of events that are relevant to a program. To produce such information, a logger constantly monitors the flow of an application and stores the necessary information (i.e. who accessed the program and at what time).\nIn Python, you can use the `logging` module to create logs. It's a popular Python built-in that's used by most third-party libraries, which means you can integrate your log messages with those of the libraries you're using, but this isn't the only cool thing about it.\nAnother cool feature of the `logging` module is the set of functions it provides to make the logging process simple. Each logging function is named after an event's severity level - this makes it possible to record the most urgent events in your program.\nThe defined levels, in order of increasing severity, are as follows:\n  * **DEBUG** : _Used to record low-level details with regards to the source code, for example, notifying the developers that a function has been called or the value of an object stored in a variable_.\n  * **INFO** : _Used for general purpose information regarding things occurring in a program such as a file being read or an email being sent._\n  * **WARNING** : _Used as a warning to inform you there's no error yet but there may be errors in the future._\n  * **ERROR** : _Used for errors that are preventable._\n  * **CRITICAL** : _Used for errors that cause the system to fail or cannot be recovered_\n\n\nIn other words, not all log messages are created equal.\nLet's take a look at the default logger that comes with the `logging` module:\ntext\n\n```\nimport logging \n```\n\ntext\n\n```\n>>> logging.debug(\"debug message\")\n>>> logging.info(\"info message\")\n>>> logging.warning(\"warning message\")\nWARNING:root:This is a warning message\n>>> logging.error(\"error message\")\nERROR:root:error message\n>>> logging.critical(\"critical message\")\nCRITICAL:root:critical message\n```\n\nYou may notice two things:\n  1. The `logging.debug()` and `logging.info()` functions are not logged. This is because the default configuration is to only log messages with a severity level of `WARNING` or above.\n  2. The output format of the logged messages is `severity_level:logger_name:logging_message`.\n\n\nWe can configure our log messages as you'll see in the next section.\n## Configuring the logger\nIn the above section, we covered the logging module with the default settings but sometimes the defaults aren't what we want. In such situations, we can set up our logger by configuring it with `logging.basicConfig()`.\nThe most commonly used parameters of `logging.basicConfig()` include:\n  * `filename`— Specifies a `FileHandler` is created using the specified `filename` instead of a `StreamHandler`; The logging output is sent to a disk file with the given `filename`.\n  * `filemode` - If a `filename` is specified then the file will be opened in the given `filemode`. The default mode is 'a': learn more about the different [modes](https://docs.python.org/3/library/functions.html#filemodes).\n  * `format` - The specified format string will be used for the handler; The default format string is `levelname:name:message` [as demonstrated above].\n  * `level` - The specified severity level the root logger should be set to.\n\n\nLet's explore these parameters further.\nWe can set the severity level of our log messages by using the `level` parameter.\ntext\n\n```\nimport logging\nfrom datetime import date\n```\n\ntext\n\n```\nlogging.basicConfig(level=logging.INFO)\n```\n\ntext\n\n```\ndef calculate_age(year_of_birth:int) -> int:\n    \"\"\"Compute the age of a person\"\"\"\n    current_year = date.today().year\n    return current_year - year_of_birth\n\nyear_of_birth = 1994\n\nlogging.info(f\"User was born in {year_of_birth} and is approximately {calculate_age(year_of_birth)} years old\")\n```\n\ntext\n\n```\n\"\"\"\nINFO:root:User was born in 1994 and is approximately 28 years old\n\"\"\"\n```\n\nIf we wanted to send our log message to a file instead of the console, we must pass the argument `filename` to our `logging.basicConfig()` and provide a name that we'd like to save the file under.\n_**Note**_ _:_`_basicConfig()_`_can only be called only if the root logger has not already been configured - it can only be called once. Thus, imagine the next few code snippets are updating the script above rather than extending it._\ntext\n\n```\nlogging.basicConfig(level=logging.INFO, filename=\"example.log\") \n```\n\nPerforming this update to our code will now append all the subsequent log messages to the file named `example.log` in your current working directory - this means if the file already exists then the logger would simply add your new logs to the end of the file.\nYou can change this behavior by setting the `filemode`. By default, the `filemode` parameter is set to `\"a\"` which means the file is \"_open for writing, appending to the end of file if it exists_ \" [**Source** : [Logging documentation](https://docs.python.org/3/library/functions.html#filemodes)]. Let's change the `filemode` to `\"w\"`: \"_open for writing, truncating the file first._ \"\ntext\n\n```\nlogging.basicConfig(level=logging.INFO, \n                    filename=\"example.log\",\n                    filemode=\"w\")\n```\n\nEach time the program is run, the log file will be rewritten because of the change we made to the `filemode`.\nAt the moment, the log message being stored is from the default formating - `levelname:name:message`. We can change this by setting the `format` parameter in our default config.\ntext\n\n```\n\"\"\"\nINFO:root:User was born in 1994 and is approximately 28 years old\n\"\"\"\n```\n\nThe message will look like this but will be written to a file named `app.log` instead of the console.\nThe `logging` module also provides [several shorthand elements](https://docs.python.org/3/library/logging.html#:~:text=LogRecord%20attributes%C2%B6) that can easily be added to the output format. For example, we can use `%(asctime)s` to output a human-readable time of when the `LogRecord` is created.\ntext\n\n```\nlogging.basicConfig(level=logging.INFO, \n                    filename=\"example.log\",\n                    format=\"%(asctime)s - %(message)s\")\n```\n\ntext\n\n```\nlogging.info(f\"User was born in {year_of_birth} and is approximately {calculate_age(year_of_birth)} years old\")\n```\n\nOur new log message in the `example.log` file will look as follows:\ntext\n\n```\n2022-05-17 08:13:16,693 - User was born in 1994 and is approximately 28 years old\n```\n\n## Creating your own logger object\nUntil this point, we have been working with the default logger which has the name `root`. The `logging` documentation advises us to create our own logger object of the `Logger` class - this is even more important when there are multiple modules in your application.\n> _Loggers should NEVER be instantiated directly, but always through the module-level function `logging.getLogger(name)`. Multiple calls to `getLogger()` with the same name will always return a reference to the same Logger object.\n>   * [**Source** : [Logger Objects documentation](<https://docs.python.org/3/library/logging.html#:~:text=Loggers%20should%20NEVER%20be%20instantiated%20directly%2C%20but%20always%20through%20the%20module%2Dlevel%20function%20logging.getLogger(name).%20Multiple%20calls%20to%20getLogger()%20with%20the%20same%20name%20will%20always%20return%20a%20reference%20to%20the%20same%20Logger%20object.)]._>\n> \n\nHere's some code from my [fraud detection project](https://github.com/kurtispykes/fraud-detection-project):\nThe name of the python file is `predict.py`: thus, we have instantiated a custom logger in the `_logger` variable called `predict` (see line 11).\n> \"It is recommended that we use module-level loggers by passing `__name__` as the name parameter to `getLogger()` to create a logger object as the name of the logger itself would tell us from where the events are being logged. `__name__` is a special built-in variable in Python which evaluates to the name of the current module.\"\n>   * [Source: [Logger Objects documentation](<https://docs.python.org/3/library/logging.html#:~:text=Loggers%20should%20NEVER%20be%20instantiated%20directly%2C%20but%20always%20through%20the%20module%2Dlevel%20function%20logging.getLogger(name).%20Multiple%20calls%20to%20getLogger()%20with%20the%20same%20name%20will%20always%20return%20a%20reference%20to%20the%20same%20Logger%20object>.)].\n> \n\n## Understanding when to use logging\nIf you're anything like me, you're probably still reading wondering how you should know what `level` a log message should be given.\nThe logging documentation provides us with a useful guide.\n![When to use logging; \\[Source: Logging HOWTO\\].](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/05/1EULb61c2eQiJLHvQBcCjIg.png)\n**When to use logging; [Source:**[**Logging HOWTO**](https://docs.python.org/3/howto/logging.html#:~:text=Task%20you%20want,and%20application%20domain)**].**\nThere's so much more we could cover about logging, but this is enough for you to get started. Apply as many of the things we've covered in this article to a personal project to cement the knowledge. Don't be afraid to refer to the [documentation](https://docs.python.org/3/howto/logging.html) when you need to.\n_Thanks for reading._\n**Connect with me:** [LinkedIn](https://www.linkedin.com/in/kurtispykes/) [Twitter](https://twitter.com/KurtisPykes) [Instagram](https://www.instagram.com/kurtispykes/)\nIf you enjoy reading stories like this one and wish to support my writing, consider [becoming a Medium member](https://kurtispykes.medium.com/membership). With a $5 a month commitment, you unlock unlimited access to stories on Medium. If you use [my sign-up link](https://kurtispykes.medium.com/membership), I'll receive a small commission.\nAlready a member? [Subscribe](https://kurtispykes.medium.com/subscribe) to be notified when I publish.\n> [**Get an email whenever Kurtis Pykes publishes.**](https://kurtispykes.medium.com/subscribe)\n## Register Now to Continue Reading\n### Unlock Towards Data Science with a Free Account\nAll articles on Towards Data Science are available to registered users. Create a free account today to access this article and thousands more.\nRegister for freeSign in to your account\n* * *\n![](https://assets.insightmediagroup.io/media/1787657084566_vncpf1.jpeg)\nWritten By\n## [Kurtis Pykes](https://towardsdatascience.com/author/kurtispykes/)\n[See all from Kurtis Pykes](https://towardsdatascience.com/author/kurtispykes/)\n[Education](https://towardsdatascience.com/tag/education/)[Programming](https://towardsdatascience.com/tag/programming/)[Python](https://towardsdatascience.com/tag/python/)[Software Development](https://towardsdatascience.com/tag/software-development/)[Technology](https://towardsdatascience.com/tag/technology/)\nShare This Article\n  * [](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F&title=How%20To%20Do%20Logging%20in%20Python)\n  * [](https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F&title=How%20To%20Do%20Logging%20in%20Python)\n  * [](https://x.com/share?url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F&text=How%20To%20Do%20Logging%20in%20Python)\n\n\nTowards Data Science is a community publication. Submit your insights to reach our global audience and earn through the TDS Author Payment Program.\n[Write for TDS](https://towardsdatascience.com/submissions/)\n## Related Articles\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/01/1Rd9IZ3SLf5vJJ_qCd6dz9w-scaled.jpeg)](https://towardsdatascience.com/a-complete-20-week-guide-to-self-learn-data-science-fundamentals-for-free-bf5873f5acc6/)\n## [A Complete 20-Week Guide to Self-Learn Data Science Fundamentals for Free](https://towardsdatascience.com/a-complete-20-week-guide-to-self-learn-data-science-fundamentals-for-free-bf5873f5acc6/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nA step-by-step guide to learn all the key concepts and become job-ready\n[Sharan Kumar Ravindran](https://towardsdatascience.com/author/rsharankumar/)\nJanuary 19, 202211 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1xqElYYwIds8NChYEdGxH7Q-scaled.jpeg)](https://towardsdatascience.com/ai-is-flawed-heres-why-3a7e90c48878/)\n## [AI is Flawed - Here's Why](https://towardsdatascience.com/ai-is-flawed-heres-why-3a7e90c48878/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nFairness in AI and AI bias\n[Arun](https://towardsdatascience.com/author/cleanpegasus/)\nOctober 31, 20206 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/11/1q6P0rUT6mUB8auSG4Cjqhw-scaled.jpeg)](https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749/)\n## [10 Examples to Master *args and **kwargs in Python](https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nHow to use and not to use them\n[Soner Yıldırım](https://towardsdatascience.com/author/sonery/)\nNovember 16, 20205 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2017/12/1VvCEehibz_TplaysWD3TdA.jpeg)](https://towardsdatascience.com/machine-learning-with-python-easy-and-robust-method-to-fit-nonlinear-data-19e8a1ddbd49/)\n## [Machine Learning with Python: Easy and robust method to fit nonlinear data](https://towardsdatascience.com/machine-learning-with-python-easy-and-robust-method-to-fit-nonlinear-data-19e8a1ddbd49/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nEasy and robust methodology for nonlinear data modeling using Python libraries, pipeline features, and regularization.\n[Tirthajyoti Sarkar](https://towardsdatascience.com/author/tirthajyoti/)\nDecember 7, 20178 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1KJFvV9apBelonVXXYT1Cew-scaled.jpeg)](https://towardsdatascience.com/how-i-let-data-influence-choices-a7a257bfa825/)\n## [How I let Data Influence Choices](https://towardsdatascience.com/how-i-let-data-influence-choices-a7a257bfa825/)\n[Product Management](https://towardsdatascience.com/category/product-management/)\nUsing data to make decisions without overshadowing common sense.\n[Jody Roberts](https://towardsdatascience.com/author/jodydavidroberts/)\nOctober 13, 20204 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2022/07/1TlUrctw7LocHteMxi9qAkQ-scaled.jpeg)](https://towardsdatascience.com/simulating-dining-philosophers-with-simpy-5abf5106e2ca/)\n## [Simulating dining philosophers with SimPy](https://towardsdatascience.com/simulating-dining-philosophers-with-simpy-5abf5106e2ca/)\n[](https://towardsdatascience.com/how-to-do-logging-in-python-37fee87b718c/)\nExplore race conditions, deadlock, and shared resources in Python\n[Federico Rosato](https://towardsdatascience.com/author/ing.rosato/)\nJuly 21, 20227 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/06/1dht5kbd4Htb94Qk9ElGaVA.png)](https://towardsdatascience.com/working-with-datetime-in-python-e032b8d2f512/)\n## [Working with DateTime in Python](https://towardsdatascience.com/working-with-datetime-in-python-e032b8d2f512/)\n[Data Science](https://towardsdatascience.com/category/data-science/)\nBecome a master of dates and times in no time\n[Sarah Beshr](https://towardsdatascience.com/author/sarahbeshr/)\nJune 17, 20216 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/05/0_k7tukRsPMECDxYs-scaled.jpg)](https://towardsdatascience.com/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61/)\n## [6 Best Python IDEs and Text Editors for Data Science Applications](https://towardsdatascience.com/6-best-python-ides-and-text-editors-for-data-science-applications-6986c4522e61/)\n[Machine Learning](https://towardsdatascience.com/category/artificial-intelligence/machine-learning/)\nBuild your application in a dynamic, structured development environment. One of the questions that programmers...\n[Sara A. Metwalli](https://towardsdatascience.com/author/saraametwalli/)\nMay 8, 20216 min read\n  * [![](https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/0Jpw8B6oEou8FkWWJ-scaled.jpg)](https://towardsdatascience.com/two-functions-to-know-in-python-bfb925bb5fff/)\n## [Two Functions to Know in Python](https://towardsdatascience.com/two-functions-to-know-in-python-bfb925bb5fff/)\n[Artificial Intelligence](https://towardsdatascience.com/category/artificial-intelligence/)\nLearn how to use the any() and all() functions in Python\n[Luay Matalka](https://towardsdatascience.com/author/lmatalka90/)\nFebruary 19, 20215 min read\n\n\n  * [YouTube](https://www.youtube.com/c/TowardsDataScience)\n  * [X](https://x.com/TDataScience)\n  * [LinkedIn](https://www.linkedin.com/company/towards-data-science/)\n  * [Threads](https://www.threads.net/@towardsdatascience)\n  * [Bluesky](https://bsky.app/profile/towardsdatascience.com)\n\n\n[](https://towardsdatascience.com/)\nYour home for data science and AI. The world's leading publication for data science, data analytics, data engineering, machine learning, and artificial intelligence professionals.\nSubscribe to Our Newsletter[Write For TDS](https://towardsdatascience.com/submissions/)•[About](https://towardsdatascience.com/about-towards-data-science-d691af11cc2f/)•[Advertise](https://contact.towardsdatascience.com/advertise-with-towards-data-science)•[Privacy Policy](https://towardsdatascience.com/privacy-policy/)•[Terms of Use](https://towardsdatascience.com/website-terms-of-use/)\n© Insight Media Group, LLC 2026•[The New Stack](https://thenewstack.io)•[roadmap.sh](https://roadmap.sh)•[Creator Network](https://insightmediagroup.io/creator-network)\n####  Recommended Articles \nClose\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607631/image?etag=1781543525510&width=500&height=500) Critical Mistakes Companies Make When Integrating AI/ML into Their Processes ](https://towardsdatascience.com/critical-mistakes-companies-make-when-integrating-ai-ml-into-their-processes/ \"Critical Mistakes Companies Make When Integrating AI/ML into Their Processes\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607686/image?etag=1782161464448&width=500&height=500) How Relevance Models Foreshadowed Transformers for NLP ](https://towardsdatascience.com/how-relevance-models-foreshadowed-transformers-for-nlp/ \"How Relevance Models Foreshadowed Transformers for NLP\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607639/image?etag=1781250125848&width=500&height=500) Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1 ](https://towardsdatascience.com/javascript-fatigue-you-dont-need-js-to-build-chatgpt/ \"Javascript Fatigue: HTMX Is All You Need to Build ChatGPT — Part 1\")\n  * [ ![](https://h030.towardsdatascience.com/rest/v2/contentStores/d7d3a4ab-7caf-4383-bbd2-fbf7fb4f1787/items/607930/image?etag=1782124566054&width=500&height=500) The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs ](https://towardsdatascience.com/subset-sum-problem-solved-in-linear-time-for-dense-enough-inputs/ \"The Subset Sum Problem Solved in Linear Time for Dense Enough Inputs\")\n\n\n",
  "metadata": {
    "title": "How To Do Logging in Python | Towards Data Science",
    "description": "Tracking Events In Your Program",
    "keywords": null,
    "author": "Kurtis Pykes",
    "og:locale": "en_US",
    "og:type": "article",
    "og:title": "How To Do Logging in Python",
    "og:description": "Tracking Events In Your Program",
    "og:url": "https://towardsdatascience.com/how-to-do-logging-in-python-37fee87b718c/",
    "og:site_name": "Towards Data Science",
    "og:image": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/05/0ODv4swqwS_0_3bYc-scaled.jpg",
    "og:image:width": "2560",
    "og:image:height": "1702",
    "og:image:type": "image/jpeg",
    "twitter:card": "summary_large_image",
    "twitter:site": "@TDataScience",
    "twitter:creator": "@TDataScience",
    "twitter:label1": "Written by",
    "twitter:data1": "Kurtis Pykes",
    "twitter:label2": "Est. reading time",
    "twitter:data2": "7 min read",
    "article:published_time": "2022-05-17T14:58:40.000Z",
    "article:modified_time": "2022-05-17T14:58:40.000Z",
    "article:author": "https://towardsdatascience.com/author/kurtispykes/"
  },
  "paywall": {
    "listed_paid": true,
    "detected": false,
    "marker": "",
    "public_only": true,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 202,
    "error": ""
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_000.txt",
      "chars": 174
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_001.txt",
      "chars": 16
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_002.txt",
      "chars": 278
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_003.txt",
      "chars": 41
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_004.txt",
      "chars": 40
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_005.txt",
      "chars": 295
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_006.txt",
      "chars": 74
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_007.txt",
      "chars": 65
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_008.txt",
      "chars": 119
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_009.txt",
      "chars": 74
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_010.txt",
      "chars": 141
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_011.txt",
      "chars": 112
    },
    {
      "language": "txt",
      "file": "attachments/f843de180930/code/block_012.txt",
      "chars": 82
    }
  ],
  "images": [
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/05/0ODv4swqwS_0_3bYc-scaled.jpg",
      "alt": "Photo by Viktor Talashuk on Unsplash",
      "local_path": "attachments/f843de180930/images/000.jpg",
      "bytes": 457213,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/05/1EULb61c2eQiJLHvQBcCjIg.png",
      "alt": "When to use logging; [Source: Logging HOWTO].",
      "local_path": "attachments/f843de180930/images/001.png",
      "bytes": 58522,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/01/1Rd9IZ3SLf5vJJ_qCd6dz9w-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/002.jpeg",
      "bytes": 402521,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1xqElYYwIds8NChYEdGxH7Q-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/003.jpeg",
      "bytes": 232779,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/11/1q6P0rUT6mUB8auSG4Cjqhw-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/004.jpeg",
      "bytes": 1258623,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2017/12/1VvCEehibz_TplaysWD3TdA.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/005.jpeg",
      "bytes": 308910,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2020/10/1KJFvV9apBelonVXXYT1Cew-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/006.jpeg",
      "bytes": 1639711,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2022/07/1TlUrctw7LocHteMxi9qAkQ-scaled.jpeg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/007.jpeg",
      "bytes": 184822,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/06/1dht5kbd4Htb94Qk9ElGaVA.png",
      "alt": "",
      "local_path": "attachments/f843de180930/images/008.png",
      "bytes": 33040,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/05/0_k7tukRsPMECDxYs-scaled.jpg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/009.jpg",
      "bytes": 334979,
      "downloaded": true
    },
    {
      "src": "https://assets.insightmediagroup.io/media/wp-content/uploads/2021/02/0Jpw8B6oEou8FkWWJ-scaled.jpg",
      "alt": "",
      "local_path": "attachments/f843de180930/images/010.jpg",
      "bytes": 266385,
      "downloaded": true
    }
  ],
  "audio": [],
  "videos": [
    {
      "src": "https://www.youtube.com/c/TowardsDataScience",
      "quality": "unavailable",
      "local_path": "",
      "note": "无1080p且无720p，未交付更低清晰度"
    }
  ],
  "links": [
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/latest/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/editors-pick/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/the-variable/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/shipai/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/submissions/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/programming/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/kurtispykes/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/education/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/programming/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/python/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/software-development/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/tag/technology/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/a-complete-20-week-guide-to-self-learn-data-science-fundamentals-for-free-bf5873f5acc6/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/category/artificial-intelligence/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/rsharankumar/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/ai-is-flawed-heres-why-3a7e90c48878/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/cleanpegasus/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749/"
    },
    {
      "type": "internal",
      "href": "https://towardsdatascience.com/author/sonery/"
    },
    {
      "type": "external",
      "href": "https://write.insightmediagroup.io"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/company/towards-data-science/"
    },
    {
      "type": "external",
      "href": "https://x.com/TDataScience"
    },
    {
      "type": "external",
      "href": "https://unsplash.com/@viktortalashuk"
    },
    {
      "type": "external",
      "href": "https://unsplash.com"
    },
    {
      "type": "external",
      "href": "https://roadmap.sh/computer-science"
    },
    {
      "type": "external",
      "href": "https://docs.python.org/3/library/functions.html"
    },
    {
      "type": "external",
      "href": "https://docs.python.org/3/library/logging.html"
    },
    {
      "type": "external",
      "href": "https://github.com/kurtispykes/fraud-detection-project"
    },
    {
      "type": "external",
      "href": "https://docs.python.org/3/howto/logging.html"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/in/kurtispykes/"
    },
    {
      "type": "external",
      "href": "https://twitter.com/KurtisPykes"
    },
    {
      "type": "external",
      "href": "https://www.instagram.com/kurtispykes/"
    },
    {
      "type": "external",
      "href": "https://kurtispykes.medium.com/membership"
    },
    {
      "type": "external",
      "href": "https://kurtispykes.medium.com/subscribe"
    },
    {
      "type": "external",
      "href": "https://www.facebook.com/sharer/sharer.php?title=How+To+Do+Logging+in+Python&u=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F"
    },
    {
      "type": "external",
      "href": "https://www.linkedin.com/shareArticle?mini=true&title=How+To+Do+Logging+in+Python&url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F"
    },
    {
      "type": "external",
      "href": "https://x.com/share?text=How+To+Do+Logging+in+Python&url=https%3A%2F%2Ftowardsdatascience.com%2Fhow-to-do-logging-in-python-37fee87b718c%2F"
    },
    {
      "type": "external",
      "href": "https://www.youtube.com/c/TowardsDataScience"
    },
    {
      "type": "external",
      "href": "https://www.threads.net/@towardsdatascience"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-14T11:11:49Z",
  "source_url": "https://towardsdatascience.com/how-to-do-logging-in-python-37fee87b718c/",
  "delivery_status": "excluded_paid",
  "discovery_status": "excluded_paid",
  "missing_reason": "按原约定排除付费/会员全文"
}