public inbox for [email protected]  
help / color / mirror / Atom feed
From: Yogesh Mahajan <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: Re: [pgAdmin][Patch] - Feature #6395 - Feature request: Log Rotation
Date: Tue, 25 May 2021 16:58:42 +0530
Message-ID: <CAMa=N=PeMQUrvz-TFK7To4og+q6d0bcfRQp3XDzBTwHtBWPhCg@mail.gmail.com> (raw)
In-Reply-To: <CANxoLDcgwrETt6B0PuLLTshr8CyPqFegVL3OOP7xOfb1bXFYPg@mail.gmail.com>
References: <CAMa=N=OAkNDvwX+c6VA1+9PDBtdHt+fTYKm8nwm8jt-BOh=9BQ@mail.gmail.com>
	<CANxoLDcgwrETt6B0PuLLTshr8CyPqFegVL3OOP7xOfb1bXFYPg@mail.gmail.com>

Hello,

Please find the attached file incorporated with the above comments except
the 2nd one.

Thanks,
Yogesh Mahajan
EnterpriseDB


On Tue, May 25, 2021 at 1:09 PM Akshay Joshi <[email protected]>
wrote:

> Hi Yogesh
>
> Following are the review comments:
>
>    - LOG_ROTATION_MAX_LOGS should be renamed to LOG_ROTATION_MAX_LOG_FILES
>    - Rollover file name should have '.log' extension at the end instead
>    of "pgadmin4.log.2021-05-25_12-17-43"
>    - Add comments in the 'enhanced_log_rotation.py' file.
>    -  'enhanced_log_rotation.py' file line no 23 should be "max_bytes =
>    max_bytes * 1024 * 1024" instead of "max_bytes = max_bytes * 1000000"
>
>
> On Tue, May 25, 2021 at 10:54 AM Yogesh Mahajan <
> [email protected]> wrote:
>
>> Hi,
>>
>> Please find the attached patch which rotates the pgadmin log file with
>> context to the parameters specified in the config file.
>>
>> # Log rotation setting
>> LOG_ROTATION_SIZE = 10  # In MBs
>> LOG_ROTATION_AGE = 1440  # In minutes
>> LOG_ROTATION_MAX_LOGS = 90  # Maximum number of backups to retain
>>
>>
>> Thanks,
>> Yogesh Mahajan
>> EnterpriseDB
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>


Attachments:

  [application/octet-stream] RM6395_v2.patch (4.3K, 3-RM6395_v2.patch)
  download | inline diff:
diff --git a/web/config.py b/web/config.py
index 4d1f98698..bdb2e6f3f 100644
--- a/web/config.py
+++ b/web/config.py
@@ -286,6 +286,13 @@ if SERVER_MODE and not IS_WIN:
 else:
     LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log')
 
+# Log rotation setting
+# Log file will be rotated considering values for LOG_ROTATION_SIZE
+# & LOG_ROTATION_AGE. Rotated file will be named in format
+# - LOG_FILE.Y-m-d_H-M-S
+LOG_ROTATION_SIZE = 10  # In MBs
+LOG_ROTATION_AGE = 1440  # In minutes
+LOG_ROTATION_MAX_LOG_FILES = 90  # Maximum number of backups to retain
 ##########################################################################
 # Server Connection Driver Settings
 ##########################################################################
diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py
index a73335371..4fdc1e009 100644
--- a/web/pgadmin/__init__.py
+++ b/web/pgadmin/__init__.py
@@ -256,7 +256,13 @@ def create_app(app_name=None):
         create_app_data_directory(config)
 
         # File logging
-        fh = logging.FileHandler(config.LOG_FILE, encoding='utf-8')
+        from pgadmin.utils.enhanced_log_rotation import \
+            EnhancedRotatingFileHandler
+        fh = EnhancedRotatingFileHandler(config.LOG_FILE,
+                                         config.LOG_ROTATION_SIZE,
+                                         config.LOG_ROTATION_AGE,
+                                         config.LOG_ROTATION_MAX_LOG_FILES)
+
         fh.setLevel(config.FILE_LOG_LEVEL)
         fh.setFormatter(logging.Formatter(config.FILE_LOG_FORMAT))
         app.logger.addHandler(fh)
diff --git a/web/pgadmin/utils/enhanced_log_rotation.py b/web/pgadmin/utils/enhanced_log_rotation.py
new file mode 100644
index 000000000..00c5e9399
--- /dev/null
+++ b/web/pgadmin/utils/enhanced_log_rotation.py
@@ -0,0 +1,59 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import re
+import logging.handlers as handlers
+
+
+class EnhancedRotatingFileHandler(handlers.TimedRotatingFileHandler,
+                                  handlers.RotatingFileHandler):
+    """
+    Handler for logging to a set of files, which switches from one file
+    to the next when the current file reaches a certain size, or at certain
+    timed intervals
+    @filename - log file name
+    @max_bytes - file size in bytes to rotate  file
+    @interval - Duration to rotate file
+    @backup_count - Maximum number of files to retain
+    @encoding - file encoding
+    @when -  'when' events supported:
+            # S - Seconds
+            # M - Minutes
+            # H - Hours
+            # D - Days
+            # midnight - roll over at midnight
+            # W{0-6} - roll over on a certain day; 0 - Monday
+    Here we are defaulting rotation with minutes interval
+    """
+    def __init__(self, filename, max_bytes=1, interval=60, backup_count=0,
+                 encoding=None, when='M'):
+        max_bytes = max_bytes * 1024 * 1024
+        handlers.TimedRotatingFileHandler.__init__(self, filename=filename,
+                                                   when=when,
+                                                   interval=interval,
+                                                   backupCount=backup_count,
+                                                   encoding=encoding)
+
+        handlers.RotatingFileHandler.__init__(self, filename=filename,
+                                              mode='a',
+                                              maxBytes=max_bytes,
+                                              backupCount=backup_count,
+                                              encoding=encoding)
+
+    # Time & Size combined rollover
+    def shouldRollover(self, record):
+        return handlers.TimedRotatingFileHandler.shouldRollover(self, record) \
+            or handlers.RotatingFileHandler.shouldRollover(self, record)
+
+    # Roll overs current file
+    def doRollover(self):
+        self.suffix = "%Y-%m-%d_%H-%M-%S"
+        self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$"
+        self.extMatch = re.compile(self.extMatch, re.ASCII)
+        handlers.TimedRotatingFileHandler.doRollover(self)


view thread (4+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: [pgAdmin][Patch] - Feature #6395 - Feature request: Log Rotation
  In-Reply-To: <CAMa=N=PeMQUrvz-TFK7To4og+q6d0bcfRQp3XDzBTwHtBWPhCg@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox