tinylog是Java的轻量级日志记录框架。 与Apache Log4j和Logback相反,tinylog由仅80KB的单个JAR文件组成,没有任何依赖性,并且具有静态logger类。 这意味着您无需使用任何样板代码为每个类创建记录器实例。
public static void main(String[] args) {
Logger.info("Hello World!"); // Logging methods are static
}
记录上下文
tinylog 1.1的新功能之一是对日志记录上下文的支持。 该功能在其他日志记录框架中被称为映射日志记录上下文(MDC),并允许使用附加数据对日志条目进行基于线程的扩展。 例如,您可以为一个线程设置一次用户IP,tinylog将在所有日志条目中包括该IP。
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
LoggingContext.put("ip", request.getRemoteAddr()); // Set IP for this and all client threads
Logger.info("Handle request");
response.getWriter().append("<h1>Hello World</h1><p>");
Logger.info("Done request");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
doGet(request, response);
}
}
如果使用负载平衡器或代理,则可以通过调用request.getHeader("X-FORWARDED-FOR").
获得真实的用户IP request.getHeader("X-FORWARDED-FOR").
日志记录上下文必须包含在日志记录格式模式中。 可以通过属性文件,系统属性或Fluent API 配置 tinylog。 您可以使用首选方式将日志记录格式模式设置为例如“ {date} [{context:ip}] {level}:{message}”,以获取以下输出:
2016-05-15 11:40:31 [89.12.191.39] INFO: Handle request
2016-05-15 11:40:31 [89.12.191.39] INFO: Done request
这样的日志记录上下文有助于重建:哪个日志条目属于哪个请求。 如果您具有登录系统,则用户名是另一个用于记录上下文的合适候选者。 也可以设置多个值。 如果使用线程池,则不要忘记在将线程返回线程池时清除日志上下文。
作家
tinylog支持多个编写器来输出日志条目。 对于Java EE应用程序,RollingFileWriter和JdbcWriter是最受欢迎的编写器。
RollingFileWriter可以将日志条目写入文件。 与基本FileWriter相反,可以在定义事件后启动新的日志文件。 此类事件可以是应用程序的开始,最大文件大小或日期。 可以将定义数量的旧日志文件保留为备份。
通过属性文件配置RollingFileWriter的示例:
tinylog.writer = rollingfile
tinylog.writer.filename = log.txt
tinylog.writer.backups = 10
tinylog.writer.label = count
tinylog.writer.policies = startup, daily
在此示例中,RollingFileWriter在应用程序启动时以及每天运行时之后启动一个新的日志文件。 最新的十个日志文件将作为备份保存并连续编号。
JdbcWriter可以将日志条目写入SQL数据库。 如果您有多台服务器,这是集中日志的一种方法。 通过属性文件配置JdbcWriter的示例:
tinylog.writer = jdbc
tinylog.writer.url = jdbc:mysql://localhost/demo
tinylog.writer.table = logs
tinylog.writer.columns = date, ip, level, message
tinylog.writer.values = DATE, CONTEXT, LEVEL, MESSAGE
tinylog.writer.username = demo
tinylog.writer.password = demo
在现代标准Java环境和大多数Web应用程序服务器中,JVM可以通过服务找到数据库驱动程序。 不幸的是,独立的Apache Tomcat需要手动加载数据库驱动程序。 这可以通过ServletContextListener完成。
@WebListener
public class LifeCycleListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
try {
new com.mysql.jdbc.Driver(); // Your database driver
} catch (SQLException e) {
Logger.error(e);
}
}
@Override
public void contextDestroyed(ServletContextEvent event) {}
}
tinylog 1.2将支持Java EE数据源。 您只需为应用程序定义一次数据库连接,然后就可以在tinylog配置中引用数据源。 另一个新功能是一旦数据库再次启动,在连接断开的情况下重新建立数据库连接。
编写线程
开箱即用,tinylog同步写入所有日志条目。 tinylog的写入线程可用于在单独的线程中执行写入器,以避免因IO操作缓慢而阻塞。 如果激活,则必须与您的应用程序一起关闭写入线程。 这可以通过观察主线程或调用shutdown方法来完成。 由于Java EE应用程序中没有可靠的长寿命线程,因此建议的方法是使用ServletContextListener关闭写入线程。
@WebListener
public class LifeCycleListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {}
@Override
public void contextDestroyed(ServletContextEvent event) {
Configurator.shutdownWritingThread(false);
}
}
源代码
GitHub上提供了Java EE示例应用程序的整个源代码。 可以在tinylog网站上找到有关tinylog的更多信息,包括完整的手册。