Skip to content

Commit

Permalink
logging: Introduced a supplemental logging rotating handler package
Browse files Browse the repository at this point in the history
Co-authored-by: Paul Sokolovsky <pfalcon@users.sourceforge.net>
Co-authored-by: Stefan Lehmann <stlm@posteo.de>
  • Loading branch information
3 people committed Apr 13, 2024
1 parent d97b821 commit 0ee18ec
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 0 deletions.
5 changes: 5 additions & 0 deletions python-stdlib/logging-rotating-handler/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Rotating File Logging Handler

Add-on package for [`logging`](../logging/). Provides a Handler that can rotate
logging output between multiple files while keeping the total filesize below a
specified limit.
65 changes: 65 additions & 0 deletions python-stdlib/logging-rotating-handler/logging/rotating_handler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import os
from . import Handler

# Author: Stefan Lehmann
# Source: https://github.com/pfalcon/pycopy-lib/blob/master/logging/logging/handlers.py

def try_remove(fn: str) -> None:
"""Try to remove a file if it existst."""
try:
os.remove(fn)
except OSError:
pass


def get_filesize(fn: str) -> int:
"""Return size of a file."""
return os.stat(fn)[6]


class RotatingFileHandler(Handler):
"""A rotating file handler like RotatingFileHandler.
Compatible with CPythons `logging.handlers.RotatingFileHandler` class.
"""

def __init__(self, filename, maxBytes=0, backupCount=0):
super().__init__()
self.filename = filename
self.maxBytes = maxBytes
self.backupCount = backupCount

try:
self._counter = get_filesize(self.filename)
except OSError:
self._counter = 0

def emit(self, record):
"""Write to file."""
msg = self.formatter.format(record)
s_len = len(msg)

if self.maxBytes and self.backupCount and self._counter + s_len > self.maxBytes:
# remove the last backup file if it is there
try_remove(self.filename + ".{0}".format(self.backupCount))

for i in range(self.backupCount - 1, 0, -1):
if i < self.backupCount:
try:
os.rename(
self.filename + ".{0}".format(i),
self.filename + ".{0}".format(i + 1),
)
except OSError:
pass

try:
os.rename(self.filename, self.filename + ".1")
except OSError:
pass
self._counter = 0

with open(self.filename, "a") as f:
f.write(msg + "\n")

self._counter += s_len
7 changes: 7 additions & 0 deletions python-stdlib/logging-rotating-handler/manifest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
metadata(version="0.7.5",
author="Stefan Lehmann, Paul Sokolovsky",
description="Rotating file handler for the logging package")

require("logging")

package("logging")

0 comments on commit 0ee18ec

Please sign in to comment.