#100DaysOfCode in Python Transcripts
Chapter: Days 31-33: Logging
Lecture: Demo: Configuring logging
0:00 Okay are we ready to start adding
0:01 logging to our application?
0:02 There's two steps.
0:03 One, we have to globally configure
0:05 how we want to log things.
0:08 Do we want our log messages to go to just standard out,
0:11 so the terminal or console?
0:12 Do we want them to go to a file,
0:13 if it's a file do you want that file based on a date
0:16 and roll as the days change,
0:18 or do you want that to just be one big file?
0:20 Or do you want to send that somewhere crazy, like,
0:23 email or desktop notifications, as you saw is possible.
0:27 So we're going to configure logging
0:29 and then we're just going to add the log actions
0:31 as a separate way.
0:33 That actually turned out to be super easy;
0:34 the only thing that's a little bit complicated
0:36 is setting this up.
0:37 So let's write a function over here
0:38 that will let us do that.
0:42 So we're going to pass in a filename,
0:43 and it can be,
0:46 let's give it a default value of None.
0:48 It can mean nothing, or we could pass in a filename.
0:51 So what we're going to do, is we're going to go over here
0:54 and we're going to actually set the level first.
0:56 So here's how this works;
0:57 we're going to say our current application is operating
0:59 at level of notice and above.
1:02 So there's like a hierarchy of levels in the logging,
1:06 there's like, trace, which is just super-verbose stuff,
1:10 there's error, which you almost never want to skip,
1:13 but maybe under normal operations
1:14 you don't want to show the trace.
1:16 Only the notices and the warnings and the errors.
1:18 So we're going to set this here.
1:20 So we're going to use logbook,
1:21 which needs to be imported at the top,
1:23 which we've just had PyCharm do,
1:25 and then we can come over here and let's say,
1:27 let's set it to 'trace' for just a minute.
1:29 So we have it absolutely verbose,
1:30 then we'll dial it back when we're done.
1:33 Alright, so we're going to choose a level,
1:35 and then based on whether we have a filename or not,
1:37 we're going to assume the fact that there's no filename,
1:40 or one was not specified,
1:42 that that just means 'send it to the console'.
1:44 But if there is a filename, we want to do that.
1:46 So we'll say this; if filename, we want to put it in the file.
1:49 So we'll say; logbook, now there's
1:51 all these little handlers in here.
1:54 There's a file handler, a 'fingers crossed' handler,
1:56 a Gmail handler, hashing, mixing, mail, etc. etc.
2:02 The one that we want, is we want a filename
2:04 that is based on the days.
2:05 So it has the date involved in the filename.
2:08 When the date changes, it automatically creates a new file,
2:11 and goes from there.
2:12 So that's going to be real nice.
2:13 So to accomplish that, what we need to use
2:15 is a time-rotating file handler.
2:19 And this takes a couple of things.
2:21 We have to obviously give it the filename,
2:23 we're going to set the level, be the level,
2:25 and then we want to set the date format so it knows
2:28 how to roll that out, and it has a default there,
2:32 and actually that default is totally fine,
2:33 so we're going to leave this off but
2:35 if you want to change that it's year, month, day,
2:38 is how it's going to print that out.
2:40 Okay, so we'll go like this,
2:42 and that's going to create the handler
2:44 and then we would just say, 'push to application'.
2:48 That means every action we do with logging
2:50 is going to use this underlying system here,
2:53 so if that's not the case,
2:55 we're going to say, 'logbook not stream handler',
2:59 we'll give it a stream, which we need to import this at the top,
3:02 'standard out'.
3:04 That's just like what happens when you say 'print'.
3:07 And the level is equal to level again,
3:09 and in this case we're going to push that to the application.
3:14 That's it. Long as we call this function, things will be initialized.
3:17 But before we get on, let's make our first log message
3:20 to be something that says,
3:22 here's how we've configured logging.
3:24 So here's a little message that we might have,
3:27 we'll say, great, the logging is initialized
3:29 and the level is trace, or something like that,
3:33 and the mode is either standard out mode or file mode,
3:36 and we can create one of these logs
3:42 and we'll have this little startup logger,
3:44 and then we can just say 'logger.'
3:46 let's say it's going to be a notice.
3:49 Okay, so this should be our very first message,
3:52 and let's just come down here and say we're going,
3:54 before we even call main we're going to say,
3:55 'init logging but no filename'.
3:58 Let's run this and see that we've got everything working.
4:02 Woo-hoo, look at that!
4:04 We have our time, we have the level, 'notice',
4:10 this comes from the log category, it's the start-up log,
4:14 this is the message that we actually wrote.
4:17 Logging initialized, level is nine,
4:19 which is a stand-in for 'trace',
4:22 and the mode is standard out,
4:23 that's why you see it here and not in a file,
4:25 and of course our app still works.