使用tinylog 1.1改进您在Java EE应用程序中的登录

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的更多信息,包括完整的手册。

翻译自: https://www.javacodegeeks.com/2016/06/improve-your-logging-in-your-java-ee-application-with-tinylog-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值