diff --git a/CHANGELOG.md b/CHANGELOG.md index 476e917..ad1cf43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.5.0] - 2025-04-15 + +### Changed + +- Log to /var/log/clone-engine.log and clone-engine.json.log + ## [0.4.1] - 2025-04-10 ### Fixed diff --git a/ogclient/lib/python3/SystemLib.py b/ogclient/lib/python3/SystemLib.py index 3b0b0ab..d86b635 100644 --- a/ogclient/lib/python3/SystemLib.py +++ b/ogclient/lib/python3/SystemLib.py @@ -3,6 +3,7 @@ import datetime from zoneinfo import ZoneInfo import sys import os +import json import shutil import inspect import glob @@ -20,6 +21,7 @@ import StringLib def _logtype2logfile (t): if 'log' == t.lower(): return ogGlobals.OGLOGFILE + if 'jsonlog' == t.lower(): return ogGlobals.OGJSONLOGFILE elif 'command' == t.lower(): return ogGlobals.OGLOGCOMMAND elif 'session' == t.lower(): return ogGlobals.OGLOGSESSION else: raise Exception (f'unknown log type ({t})') @@ -35,24 +37,40 @@ def ogEcho (logtypes, loglevel, msg): logfiles = ['/dev/stdout'] if type (logtypes) is list: for l in logtypes: - logfiles.append (_logtype2logfile (l)) + if 'log' == l: + logfiles.append (_logtype2logfile ('log')) + logfiles.append (_logtype2logfile ('jsonlog')) + else: + logfiles.append (_logtype2logfile (l)) else: ## string - logfiles.append (_logtype2logfile (logtypes)) + if 'log' == logtypes: + logfiles.append (_logtype2logfile ('log')) + logfiles.append (_logtype2logfile ('jsonlog')) + else: + logfiles.append (_logtype2logfile (logtypes)) if loglevel is None or 'help' == loglevel: if ogGlobals.DEBUG.lower() != "no": logfiles.append (ogGlobals.OGLOGFILE) + logfiles.append (ogGlobals.OGJSONLOGFILE) for f in logfiles: with open (f, 'a') as fd: - fd.write (msg + '\n') + if ogGlobals.OGJSONLOGFILE == f: + fd.write (json.dumps ({'message':msg}) + '\n') + else: + fd.write (msg + '\n') return if 'info' == loglevel or 'warning' == loglevel or 'error' == loglevel: - DATETIME = datetime.datetime.now(ZoneInfo(ogGlobals.TZ)).strftime("%F %T %Z") + DATETIME = datetime.datetime.now (ZoneInfo (ogGlobals.TZ)).strftime ('%F %T %Z') + DATETIME_json = datetime.datetime.now (ZoneInfo (ogGlobals.TZ)).strftime ('%Y-%m-%d %H:%M:%S') for f in logfiles: with open (f, 'a') as fd: - fd.write (f"OpenGnsys {loglevel} {DATETIME} {msg}\n") + if ogGlobals.OGJSONLOGFILE == f: + fd.write (json.dumps ({'timestamp':DATETIME_json, 'severity':loglevel, 'message':msg}) + '\n') + else: + fd.write (f"OpenGnsys {loglevel} {DATETIME} {msg}\n") else: raise Exception (f'unknown loglevel ({loglevel})') @@ -75,10 +93,18 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs): if type (logtypes) is list: for l in logtypes: logtypes = list (map (lambda x: x.lower(), logtypes)) - logfiles.append (_logtype2logfile (l)) + if 'log' == l: + logfiles.append (_logtype2logfile ('log')) + logfiles.append (_logtype2logfile ('jsonlog')) + else: + logfiles.append (_logtype2logfile (l)) else: ## string logtypes = logtypes.lower() - logfiles.append (_logtype2logfile (logtypes)) + if 'log' == logtypes: + logfiles.append (_logtype2logfile ('log')) + logfiles.append (_logtype2logfile ('jsonlog')) + else: + logfiles.append (_logtype2logfile (logtypes)) if not fun: ogRaiseError ([], ogGlobals.OG_ERR_FORMAT, 'no function provided') @@ -103,7 +129,6 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs): # ## redirect stdout only # eval $COMMAND | tee -a $FILES - import time sout = serr = '' if 'command' in logtypes: os.unlink (ogGlobals.OGLOGCOMMAND) @@ -121,14 +146,19 @@ def ogExecAndLog (logtypes, fun, *args, **kwargs): if sout or serr or ('True' != rc_str and 'False' != rc_str and 'None' != rc_str): for f in logfiles: with open (f, 'a') as fd: - if sout: fd.write (f'{sout}\n') - if serr: fd.write (f'{serr}\n') - if rc_str: fd.write (f'{rc_str}\n') - #fd.write (f"ogExecAndLog: {fun.__name__} rc:\n{rc_str}\n") - #if sout: fd.write (f"ogExecAndLog: {fun.__name__} stdout:\n{sout}\n") - #else: fd.write (f"ogExecAndLog: {fun.__name__} stdout: (none)\n") - #if serr: fd.write (f"ogExecAndLog: {fun.__name__} stderr:\n{serr}\n") - #else: fd.write (f"ogExecAndLog: {fun.__name__} stderr: (none)\n") + if ogGlobals.OGJSONLOGFILE == f: + if sout: fd.write (json.dumps ({'message':sout}) + '\n') + if serr: fd.write (json.dumps ({'message':serr}) + '\n') + if rc_str: fd.write (json.dumps ({'message':rc_str}) + '\n') + else: + if sout: fd.write (f'{sout}\n') + if serr: fd.write (f'{serr}\n') + if rc_str: fd.write (f'{rc_str}\n') + #fd.write (f"ogExecAndLog: {fun.__name__} rc:\n{rc_str}\n") + #if sout: fd.write (f"ogExecAndLog: {fun.__name__} stdout:\n{sout}\n") + #else: fd.write (f"ogExecAndLog: {fun.__name__} stdout: (none)\n") + #if serr: fd.write (f"ogExecAndLog: {fun.__name__} stderr:\n{serr}\n") + #else: fd.write (f"ogExecAndLog: {fun.__name__} stderr: (none)\n") return rc diff --git a/ogclient/lib/python3/ogGlobals.py b/ogclient/lib/python3/ogGlobals.py index 7e978fc..beb3d97 100644 --- a/ogclient/lib/python3/ogGlobals.py +++ b/ogclient/lib/python3/ogGlobals.py @@ -88,8 +88,9 @@ OGPYFUNCS = os.path.join (OPENGNSYS, 'functions') OGSCRIPTS = os.path.join (OPENGNSYS, 'scripts') OGIMG = os.path.join (OPENGNSYS, 'images') OGCAC = os.path.join (OPENGNSYS, 'cache') -OGLOG = os.path.join (OPENGNSYS, 'log') -OGLOGFILE = f'{OGLOG}/{ip}.log' +OGLOG = '/var/log' +OGLOGFILE = f'{OGLOG}/clone-engine.log' +OGJSONLOGFILE = f'{OGLOG}/clone-engine.json.log' DEBUG = 'yes' _path = os.environ['PATH'] + ':/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/opt/oglive/rootfs/opt/drbl/sbin' os.environ['PATH'] = ':'.join ([OGSCRIPTS, _path, OGAPI, OGBIN])