Java程序中日志的实践

清单 1. JUL 中自定义格式化器的实现

public class CustomFormatter extends Formatter { 
    public String format(LogRecord record) { 
        return String.format("<%s> [%s] : %s", new Date(record.getMillis()), record.getLoggerName(), record.getMessage()); 
    } 
 }

清单 2. 在 JUL 配置文件中指定自定义的格式化器类

 java.util.logging.ConsoleHandler.formatter = logging.jul.CustomFormatter

清单 3. Log4j 中日志记录的自定义方式

log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n

清单 4. SLF4J 的使用方式

 public class Slf4jBasic { 
    private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jBasic.class); 
    public void logBasic() { 
        if (LOGGER.isInfoEnabled()) { 
            LOGGER.info("My log message for %s", "Alex"); 
        } 
    } 
 }

清单 5. MDC 使用示例

public class MdcSample { 
    private static final Logger LOGGER = Logger.getLogger("mdc"); 
    public void log() { 
        MDC.put("username", "Alex"); 
        if (LOGGER.isInfoEnabled()) { 
            LOGGER.info("This is a message."); 
        } 
    } 
 }

清单 5 中,在记录日志前,首先在 MDC 中保存了名称为“username”的数据。其中包含的数据可以在格式化日志记录时直接引用,如清单 6 所示,“%X{username}”表示引用 MDC 中“username”的值

清单 6. 使用 MDC 中记录的数据

log4j.appender.stdout.layout.ConversionPattern=%X{username} %d{yyyy-MM-dd HH:mm:ss} [%p] %c - %m%n

清单 7. 检查日志是否可以被记录

 if (LOGGER.isDebugEnabled()) { 
    LOGGER.debug("This is a message."); 
 }

清单 8. 使用半结构化的日志消息

 [user1] 用户登录成功。
 [user1] 用户成功购买产品 A。
 [user2] 订单 003 付款失败。

清单 9. logstash 配置文件示例

 input { 
  file { 
    path => [ "/var/log/*.log", "/var/log/messages", "/var/log/syslog" ] 
    type => 'syslog'
  } 
 } 

 output { 
  stdout { 
 debug => true 
 debug_format => "json" 
  } 
 }

清单 10. 使用 grok 提取日志记录中的内容

//Apache 访问日志
49.50.214.136 GET /index.html 200 1150 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17"
//grok 提取模式
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:status} %{NUMBER:bytes} %{QS:useragent}

清单 11. 配置 logstash 输出到 Graylog2

 output { 
  gelf { 
    host => '127.0.0.1'
  } 
 }



你可能感兴趣的:(Java程序中日志的实践)