Files
iRedAdmin-Pro-SQL/libs/logger.py
2023-04-10 07:18:32 +02:00

84 lines
2.5 KiB
Python

import sys
import logging
import traceback
from logging.handlers import SysLogHandler
import web
from libs import iredutils
import settings
session = web.config.get("_session")
# Set application name.
logger = logging.getLogger("iredadmin")
# Set log level.
_log_level = getattr(logging, str(settings.LOG_LEVEL).upper())
logger.setLevel(_log_level)
if settings.LOG_TARGET == "stdout":
_handler = logging.StreamHandler()
_formatter = logging.Formatter("%(message)s (%(pathname)s, L%(lineno)d)")
else:
# Defaults to "syslog":
_facility = getattr(SysLogHandler, "LOG_" + settings.SYSLOG_FACILITY.upper())
_formatter = logging.Formatter("%(name)s %(message)s (%(pathname)s, L%(lineno)d)")
if settings.SYSLOG_SERVER.startswith("/"):
# Log to a local socket
_handler = SysLogHandler(address=settings.SYSLOG_SERVER, facility=_facility)
else:
# Log to a network address
_server = (settings.SYSLOG_SERVER, settings.SYSLOG_PORT)
_handler = SysLogHandler(address=_server, facility=_facility)
_handler.setFormatter(_formatter)
logger.addHandler(_handler)
def log_traceback():
exc_type, exc_value, exc_traceback = sys.exc_info()
msg = traceback.format_exception(exc_type, exc_value, exc_traceback)
logger.error(msg)
def log_activity(msg, admin="", domain="", username="", event="", loglevel="info"):
try:
if not admin:
admin = session.get("username")
if username and not domain:
domain = username.split("@", 1)[-1]
msg = str(msg)
# Prepend '[API]' in log message
try:
if web.ctx.fullpath.startswith("/api/"):
msg = "[API] " + msg
except:
pass
web.conn_iredadmin.insert(
"log",
admin=str(admin),
domain=str(domain),
username=str(username),
loglevel=str(loglevel),
event=str(event),
msg=msg,
ip=web.ctx.ip,
timestamp=iredutils.get_gmttime(),
)
if loglevel == "info":
logger.info("{0} admin={1}, domain={2}, username={3}, event={4}, "
"ip={5}".format(msg, admin, domain, username, event, web.ctx.ip))
elif loglevel == "error":
logger.error("{0} admin={1}, domain={2}, username={3}, event={4}, "
"ip={5}".format(msg, admin, domain, username, event, web.ctx.ip))
except:
pass
return None