You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.6 KiB

import os
import logging
import logging.handlers
# import splunk
LOG_DEFAULT_FMT = (
"%(asctime)s process:%(process)d thread:%(threadName)s %(levelname)s "
"[%(name)s] [%(module)s:%(lineno)d] [%(funcName)s] %(message)s"
)
ITSI_CONTENT_LOGGER = "itsicontent"
ITSI_CONTENT_LOG_FILE = "itsi_content_packs_itsicontent.log"
try:
SPLUNK_HOME = os.environ["SPLUNK_HOME"]
except KeyError:
SPLUNK_HOME = None
if SPLUNK_HOME is None:
home_dir = os.path.expanduser("~")
LOGGING_FILE_NAME = os.path.join(home_dir, ITSI_CONTENT_LOG_FILE)
print(
"-----> itsicontent log file is created at {}".format(
os.path.abspath(LOGGING_FILE_NAME)
)
)
else:
LOGGING_DEFAULT_CONFIG_FILE = os.path.join(SPLUNK_HOME, "etc", "log.cfg")
LOGGING_LOCAL_CONFIG_FILE = os.path.join(SPLUNK_HOME, "etc", "log-local.cfg")
LOGGING_STANZA_NAME = "python"
BASE_LOG_PATH = os.path.join("var", "log", "splunk")
LOGGING_FILE_NAME = os.path.join(SPLUNK_HOME, BASE_LOG_PATH, ITSI_CONTENT_LOG_FILE)
def setupSplunkLogger(
baseLogger, defaultConfigFile, localConfigFile, loggingStanzaName, verbose=True
):
"""
Cloned from splunk.setupSplunkLogger
Takes the base logging.logger instance, and scaffolds the splunk logging namespace
and sets up the logging levels as defined in the config files
"""
levels = getSplunkLoggingConfig(
baseLogger, defaultConfigFile, localConfigFile, loggingStanzaName, verbose
)
for item in levels:
loggerName = item[0]
level = item[1]
if hasattr(logging, level):
logging.getLogger(loggerName).setLevel(getattr(logging, level))
if verbose and (
loggerName == "appender.python.maxFileSize"
or loggerName == "appender.python.maxBackupIndex"
):
baseLogger.info(
"Python log rotation is not supported. Ignoring %s" % loggerName
)
def getSplunkLoggingConfig(
baseLogger, defaultConfigFile, localConfigFile, loggingStanzaName, verbose
):
"""
Cloned from splunk.getSplunkLoggingConfig
"""
loggingLevels = []
# read in config file and set logging levels
if os.access(localConfigFile, os.R_OK):
if verbose:
baseLogger.info("Using local logging config file: %s" % localConfigFile)
logConfig = open(localConfigFile, "r")
else:
if verbose:
baseLogger.info("Using default logging config file: %s" % defaultConfigFile)
logConfig = open(defaultConfigFile, "r")
try:
inStanza = False
for line in logConfig:
# strip comments
line = line.strip()
if "#" in line:
line = line[: (line.index("#"))]
# skip blank lines
line = line.strip()
if not line:
continue
# # # skip malformatted lines: stanza, key=value, or WTF?
if line.startswith("["):
if not line.endswith("]") or line.index("]") != (len(line) - 1):
continue
elif "=" in line:
key_test, value_test = line.split("=")
if not key_test or not value_test:
continue
else:
continue
# # # validation done, now we finally have parsing logic proper
if not inStanza and line.startswith("[%s]" % loggingStanzaName):
inStanza = True
continue
elif inStanza:
if line.startswith("["):
break
else:
name, level = line.split("=", 1)
if verbose:
baseLogger.info(
"Setting logger=%s level=%s" % (name.strip(), level.strip())
)
loggingLevels.append((name.strip(), level.strip().upper()))
except Exception as e:
baseLogger.exception(e)
finally:
if logConfig:
logConfig.close()
return loggingLevels
def setup_logging():
_logger = logging.getLogger(ITSI_CONTENT_LOGGER)
splunk_log_handler = logging.handlers.RotatingFileHandler(
LOGGING_FILE_NAME, maxBytes=5000000, backupCount=5
)
splunk_log_handler.setFormatter(logging.Formatter(LOG_DEFAULT_FMT))
_logger.addHandler(splunk_log_handler)
if SPLUNK_HOME is not None:
# splunk.setupSplunkLogger
setupSplunkLogger(
_logger,
LOGGING_DEFAULT_CONFIG_FILE,
LOGGING_LOCAL_CONFIG_FILE,
LOGGING_STANZA_NAME,
)
_logger.setLevel(logging.INFO)
return _logger
logger = setup_logging()