使用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 threadsLogger.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的示例:
在現代標準Java環境和大多數Web應用程序服務器中,JVM可以通過服務找到數據庫驅動程序。 不幸的是,獨立的Apache Tomcat需要手動加載數據庫驅動程序。 這可以通過ServletContextListener完成。
@WebListener public class LifeCycleListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent event) {try {new com.mysql.jdbc.Driver(); // Your database driver} catch (SQLException e) {Logger.error(e);}}@Overridepublic void contextDestroyed(ServletContextEvent event) {}}tinylog 1.2將支持Java EE數據源。 您只需為應用程序定義一次數據庫連接,然后就可以在tinylog配置中引用數據源。 另一個新功能是一旦數據庫再次啟動,在連接斷開的情況下重新建立數據庫連接。
編寫線程
開箱即用,tinylog同步寫入所有日志條目。 tinylog的寫入線程可用于在單獨的線程中執行寫入器,以避免因IO操作緩慢而阻塞。 如果激活,則必須與您的應用程序一起關閉寫入線程。 這可以通過觀察主線程或調用shutdown方法來完成。 由于Java EE應用程序中沒有可靠的長壽命線程,因此建議的方法是使用ServletContextListener關閉寫入線程。
@WebListener public class LifeCycleListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent event) {}@Overridepublic 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
總結
以上是生活随笔為你收集整理的使用tinylog 1.1改进您在Java EE应用程序中的登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迟到20年的中国格斗机器人综艺,能否成为
- 下一篇: java锁实现_Java锁实现