view src/luan/modules/logging/Logging.luan @ 1101:14ffce5bb894

make logging more flexible
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 02 Jun 2017 16:42:15 -0600
parents bae2d0c2576c
children 3995cbe5b00a
line wrap: on
line source

local Luan = require "luan:Luan.luan"
local error = Luan.error
local pairs = Luan.pairs or error()
java()
local Logger = require "java:org.apache.log4j.Logger"
local EnhancedPatternLayout = require "java:org.apache.log4j.EnhancedPatternLayout"
local ConsoleAppender = require "java:org.apache.log4j.ConsoleAppender"
local Level = require "java:org.apache.log4j.Level"
local RollingFileAppender = require "java:org.apache.log4j.RollingFileAppender"
local LuanLogger = require "java:luan.modules.logging.LuanLogger"


local Logging = {}

Logging.layout = "%d %-5p %c - %m%n"

Logging.appenders = {
	["System.err"] = "INFO"
}

Logging.max_file_size = nil  -- by default is "10MB"


Logging.log4j_root_logger = Logger.getRootLogger()

local function to_level(level)
	return level and Level.toLevel(level)
end

function Logging.log_to_file(file,logger_name)  -- logger_name is optional, defaults to root logger
	local appender = RollingFileAppender.new(Logging.ptn_layout, file)
	appender.setMaxFileSize(Logging.max_file_size)
	local logger = logger_name and Logger.getLogger(logger_name) or Logging.log4j_root_logger
	logger.addAppender(appender)
	return appender
end

function Logging.init()
	Logging.ptn_layout = EnhancedPatternLayout.new(Logging.layout)
	Logging.log4j_root_logger.removeAllAppenders()

	local root_level = Level.FATAL
	for _, level in pairs(Logging.appenders) do
		level = to_level(level)
		if not level.isGreaterOrEqual(root_level) then
			root_level = level
		end
	end
	Logging.log4j_root_logger.setLevel(root_level)

	for name, level in pairs(Logging.appenders) do
		level = to_level(level)
		local appender
		if name == "System.err" or name == "System.out" then
			appender = ConsoleAppender.new(Logging.ptn_layout,name)
			Logging.log4j_root_logger.addAppender(appender)
		else
			appender = Logging.log_to_file(name)
		end
		if level ~= root_level then
			appender.setThreshold(level)
		end
	end
end


local function to_luan_logger(log4j_logger)
	local tbl = {}

	local luanLogger = LuanLogger.new(log4j_logger)
	tbl.error = luanLogger.error
	tbl.warn = luanLogger.warn
	tbl.info = luanLogger.info
	tbl.debug = luanLogger.debug

	function tbl.get_level()
		local level = log4j_logger.getLevel()
		return level and level.toString()
	end

	function tbl.get_effective_level()
		local level = log4j_logger.getEffectiveLevel()
		return level and level.toString()
	end

	function tbl.set_level(level)
		log4j_logger.setLevel( to_level(level) )
	end

	return tbl
end

function Logging.logger(name)
	return to_luan_logger( Logger.getLogger(name) )
end

function Logging.root_logger()
	return to_luan_logger( Logger.getRootLogger() )
end

return Logging