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