From ae435bd5f9c5d1dc559afe8d8e38e3e0e021656c Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Tue, 6 Aug 2019 21:50:15 -0500 Subject: [PATCH] limit log file line count --- .../onionrcommunicatortimers.py | 2 +- onionr/httpapi/fdsafehandler.py | 9 - onionr/logger.py | 250 ------------------ onionr/logger/raw.py | 18 +- onionr/logger/settings.py | 2 + 5 files changed, 16 insertions(+), 265 deletions(-) delete mode 100755 onionr/logger.py diff --git a/onionr/communicatorutils/onionrcommunicatortimers.py b/onionr/communicatorutils/onionrcommunicatortimers.py index a6b8c408..bbdb9c95 100755 --- a/onionr/communicatorutils/onionrcommunicatortimers.py +++ b/onionr/communicatorutils/onionrcommunicatortimers.py @@ -46,7 +46,7 @@ class OnionrCommunicatorTimers: if self.requiresPeer and len(self.daemonInstance.onlinePeers) == 0: raise onionrexceptions.OnlinePeerNeeded except onionrexceptions.OnlinePeerNeeded: - pass + return else: if self.makeThread: for i in range(self.threadAmount): diff --git a/onionr/httpapi/fdsafehandler.py b/onionr/httpapi/fdsafehandler.py index a24d78ca..e132911e 100644 --- a/onionr/httpapi/fdsafehandler.py +++ b/onionr/httpapi/fdsafehandler.py @@ -12,12 +12,3 @@ class FDSafeHandler(WSGIHandler): pass else: raise - ''' - def handle_error(self, two, three, four): - if two is self.timeout: - self.result = [b"Timeout"] - self.start_response("200 OK", []) - self.process_result() - else: - WSGIHandler.handle_error(self) - ''' \ No newline at end of file diff --git a/onionr/logger.py b/onionr/logger.py deleted file mode 100755 index 34dc4d06..00000000 --- a/onionr/logger.py +++ /dev/null @@ -1,250 +0,0 @@ -''' - Onionr - P2P Microblogging Platform & Social network - - This file handles all operations involving logging -''' -''' - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -''' - -import re, sys, time, traceback, os - -class colors: - ''' - This class allows you to set the color if ANSI codes are supported - ''' - reset='\033[0m' - bold='\033[01m' - disable='\033[02m' - underline='\033[04m' - reverse='\033[07m' - strikethrough='\033[09m' - invisible='\033[08m' - italics='\033[3m' - class fg: - black='\033[30m' - red='\033[31m' - green='\033[32m' - orange='\033[33m' - blue='\033[34m' - purple='\033[35m' - cyan='\033[36m' - lightgrey='\033[37m' - darkgrey='\033[90m' - lightred='\033[91m' - lightgreen='\033[92m' - yellow='\033[93m' - lightblue='\033[94m' - pink='\033[95m' - lightcyan='\033[96m' - class bg: - black='\033[40m' - red='\033[41m' - green='\033[42m' - orange='\033[43m' - blue='\033[44m' - purple='\033[45m' - cyan='\033[46m' - lightgrey='\033[47m' - @staticmethod - def filter(data): - return re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]').sub('', str(data)) - -''' - Use the bitwise operators to merge these settings -''' -USE_ANSI = 0b100 -if os.name == 'nt': - USE_ANSI = 0b000 -OUTPUT_TO_CONSOLE = 0b010 -OUTPUT_TO_FILE = 0b001 - -LEVEL_DEBUG = 1 -LEVEL_INFO = 2 -LEVEL_WARN = 3 -LEVEL_ERROR = 4 -LEVEL_FATAL = 5 -LEVEL_IMPORTANT = 6 - -_type = OUTPUT_TO_CONSOLE | USE_ANSI # the default settings for logging -_level = LEVEL_DEBUG # the lowest level to log -_outputfile = 'data/onionr.log' # the file to log to - -def set_settings(type): - ''' - Set the settings for the logger using bitwise operators - ''' - - global _type - _type = type - -def get_settings(): - ''' - Get settings from the logger - ''' - - return _type - -def set_level(level): - ''' - Set the lowest log level to output - ''' - - global _level - _level = level - -def get_level(): - ''' - Get the lowest log level currently being outputted - ''' - - return _level - -def set_file(outputfile): - ''' - Set the file to output to, if enabled - ''' - - global _outputfile - _outputfile = outputfile - -def get_file(): - ''' - Get the file to output to - ''' - - return _outputfile - -def raw(data, fd = sys.stdout, sensitive = False): - ''' - Outputs raw data to console without formatting - ''' - - if get_settings() & OUTPUT_TO_CONSOLE: - ts = fd.write('%s\n' % data) - if get_settings() & OUTPUT_TO_FILE and not sensitive: - try: - with open(_outputfile, "a+") as f: - f.write(colors.filter(data) + '\n') - except OSError: - pass - -def log(prefix, data, color = '', timestamp=True, fd = sys.stdout, prompt = True, sensitive = False): - ''' - Logs the data - prefix : The prefix to the output - data : The actual data to output - color : The color to output before the data - ''' - curTime = '' - if timestamp: - curTime = time.strftime("%m-%d %H:%M:%S") + ' ' - - output = colors.reset + str(color) + ('[' + colors.bold + str(prefix) + colors.reset + str(color) + '] ' if prompt is True else '') + curTime + str(data) + colors.reset - if not get_settings() & USE_ANSI: - output = colors.filter(output) - - raw(output, fd = fd, sensitive = sensitive) - -def readline(message = ''): - ''' - Takes in input from the console, not stored in logs - message: The message to display before taking input - ''' - - color = colors.fg.green + colors.bold - output = colors.reset + str(color) + '... ' + colors.reset + str(message) + colors.reset - - if not get_settings() & USE_ANSI: - output = colors.filter(output) - - sys.stdout.write(output) - - return input() - -def confirm(default = 'y', message = 'Are you sure %s? '): - ''' - Displays an "Are you sure" message, returns True for Y and False for N - message: The confirmation message, use %s for (y/n) - default: which to prefer-- y or n - ''' - - color = colors.fg.green + colors.bold - - default = default.lower() - confirm = colors.bold - if default.startswith('y'): - confirm += '(Y/n)' - else: - confirm += '(y/N)' - confirm += colors.reset + color - - output = colors.reset + str(color) + '... ' + colors.reset + str(message) + colors.reset - - if not get_settings() & USE_ANSI: - output = colors.filter(output) - - sys.stdout.write(output.replace('%s', confirm)) - - inp = input().lower() - - if 'y' in inp: - return True - if 'n' in inp: - return False - else: - return default == 'y' - -# debug: when there is info that could be useful for debugging purposes only -def debug(data, error = None, timestamp = True, prompt = True, sensitive = False, level = LEVEL_DEBUG): - if get_level() <= level: - log('/', data, timestamp = timestamp, prompt = prompt, sensitive = sensitive) - if not error is None: - debug('Error: ' + str(error) + parse_error()) - -# info: when there is something to notify the user of, such as the success of a process -def info(data, timestamp = False, prompt = True, sensitive = False, level = LEVEL_INFO): - if get_level() <= level: - log('+', data, colors.fg.green, timestamp = timestamp, prompt = prompt, sensitive = sensitive) - -# warn: when there is a potential for something bad to happen -def warn(data, error = None, timestamp = True, prompt = True, sensitive = False, level = LEVEL_WARN): - if not error is None: - debug('Error: ' + str(error) + parse_error()) - if get_level() <= level: - log('!', data, colors.fg.orange, timestamp = timestamp, prompt = prompt, sensitive = sensitive) - -# error: when only one function, module, or process of the program encountered a problem and must stop -def error(data, error = None, timestamp = True, prompt = True, sensitive = False, level = LEVEL_ERROR): - if get_level() <= level: - log('-', data, colors.fg.red, timestamp = timestamp, fd = sys.stderr, prompt = prompt, sensitive = sensitive) - if not error is None: - debug('Error: ' + str(error) + parse_error()) - -# fatal: when the something so bad has happened that the program must stop -def fatal(data, error = None, timestamp=True, prompt = True, sensitive = False, level = LEVEL_FATAL): - if not error is None: - debug('Error: ' + str(error) + parse_error(), sensitive = sensitive) - if get_level() <= level: - log('#', data, colors.bg.red + colors.fg.green + colors.bold, timestamp = timestamp, fd = sys.stderr, prompt = prompt, sensitive = sensitive) - -# returns a formatted error message -def parse_error(): - details = traceback.extract_tb(sys.exc_info()[2]) - output = '' - - for line in details: - output += '\n ... module %s in %s:%i' % (line[2], line[0], line[1]) - - return output diff --git a/onionr/logger/raw.py b/onionr/logger/raw.py index f6c43b6f..a4738872 100644 --- a/onionr/logger/raw.py +++ b/onionr/logger/raw.py @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . ''' -import sys +import sys, os from . import settings, colors colors = colors.Colors def raw(data, fd = sys.stdout, terminal = False): @@ -31,8 +31,16 @@ def raw(data, fd = sys.stdout, terminal = False): except OSError: pass if settings.get_settings() & settings.OUTPUT_TO_FILE: + fdata = '' try: - with open(settings._outputfile, "a+") as f: - f.write(colors.filter(data) + '\n') - except OSError: - pass \ No newline at end of file + with open(settings._outputfile, 'r') as file: + fdata = file.read() + except FileNotFoundError: + pass + fdata = fdata + '\n' + data + fdata = fdata.split('\n') + if len(fdata) >= settings.MAX_LOG_FILE_LINES: + fdata.pop(0) + fdata = '\n'.join(fdata) + with open(settings._outputfile, 'w') as file: + file.write(fdata) \ No newline at end of file diff --git a/onionr/logger/settings.py b/onionr/logger/settings.py index 98f11357..cc1a2967 100644 --- a/onionr/logger/settings.py +++ b/onionr/logger/settings.py @@ -35,6 +35,8 @@ LEVEL_ERROR = 4 LEVEL_FATAL = 5 LEVEL_IMPORTANT = 6 +MAX_LOG_FILE_LINES = 10000 + _type = OUTPUT_TO_CONSOLE | USE_ANSI # the default settings for logging _level = LEVEL_DEBUG # the lowest level to log _outputfile = '%s/onionr.log' % (data_home,) # the file to log to