清单 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' } }