Ubuntu中Java日志管理怎么做
导读:Ubuntu 上 Java 日志管理实操指南 一 整体思路与分层 应用内使用成熟的日志框架(如 SLF4J + Logback 或 Log4j2)进行日志输出、格式化和滚动。 系统层用 logrotate 做文件轮转、压缩与清理,避免磁盘...
Ubuntu 上 Java 日志管理实操指南
一 整体思路与分层
- 应用内使用成熟的日志框架(如 SLF4J + Logback 或 Log4j2)进行日志输出、格式化和滚动。
- 系统层用 logrotate 做文件轮转、压缩与清理,避免磁盘被占满。
- 运行在 systemd 的服务,用 journalctl 统一查看与检索服务日志。
- 需要集中化时,搭建 ELK(Elasticsearch + Logstash + Kibana) 或 Graylog 做检索与可视化。
二 应用内日志框架配置
- 选择组合:推荐 SLF4J + Logback(性能与功能均衡),或 Log4j2(异步与丰富插件)。
- 输出目标:同时支持 控制台 与 滚动文件,便于本地排查与长期留存。
- 滚动策略:按 时间/大小 滚动,设置保留天数与压缩,避免单文件过大。
- 日志级别:生产以 INFO/WARN/ERROR 为主,调试阶段可临时开启 DEBUG。
- 结构化:尽量输出 JSON 或统一 Pattern,便于后续采集与检索。
- 最小示例
- Logback(resources/logback.xml)
< configuration> < appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> < encoder> < pattern> %d{ yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{ 36} - %msg%n< /pattern> < /encoder> < /appender> < appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> < file> logs/app.log< /file> < rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> < fileNamePattern> logs/app.%d{ yyyy-MM-dd} .%i.log< /fileNamePattern> < maxHistory> 30< /maxHistory> < timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> < maxFileSize> 100MB< /maxFileSize> < /timeBasedFileNamingAndTriggeringPolicy> < /rollingPolicy> < encoder> < pattern> %d{ yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{ 36} - %msg%n< /pattern> < /encoder> < /appender> < root level="info"> < appender-ref ref="CONSOLE"/> < appender-ref ref="FILE"/> < /root> < /configuration> - Log4j2(resources/log4j2.xml)
< ?xml version="1.0" encoding="UTF-8"?> < Configuration status="WARN"> < Appenders> < Console name="Console" target="SYSTEM_OUT"> < PatternLayout pattern="%d{ yyyy-MM-dd HH:mm:ss} %-5p %c{ 1} :%L - %m%n"/> < /Console> < RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{ yyyy-MM-dd} -%i.log"> < PatternLayout pattern="%d{ yyyy-MM-dd HH:mm:ss} %-5p %c{ 1} :%L - %m%n"/> < Policies> < TimeBasedTriggeringPolicy interval="1" modulate="true"/> < SizeBasedTriggeringPolicy size="100 MB"/> < /Policies> < DefaultRolloverStrategy max="20"/> < /RollingFile> < /Appenders> < Loggers> < Root level="info"> < AppenderRef ref="Console"/> < AppenderRef ref="RollingFile"/> < /Root> < /Loggers> < /Configuration> - 如无法引入第三方框架,可用 JUL(java.util.logging) 并通过启动参数指定配置:
参考配置(logging.properties):java -Djava.util.logging.config.file=logging.properties -jar myapp.jarhandlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler java.util.logging.FileHandler.pattern=/var/log/myapp/java.log java.util.logging.FileHandler.limit=10485760 java.util.logging.FileHandler.count=5 java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter .level=INFO
- Logback(resources/logback.xml)
以上做法覆盖 Log4j/Logback/SLF4J 与 JUL 的常见用法与最小可用配置。
三 系统层日志轮转与清理
- 使用 logrotate 管理应用日志文件(适合文件日志,而非 journald 日志)。
- 放置配置:在 /etc/logrotate.d/ 创建应用专属配置,例如 /etc/logrotate.d/myapp:
/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0640 myapp myapp sharedscripts postrotate # 若应用支持信号重载;不支持时可省略或改为重启 kill -USR1 $(cat /var/run/myapp.pid 2> /dev/null) 2> /dev/null || true endscript } - 测试与生效
- 手动测试:
sudo logrotate -vf /etc/logrotate.d/myapp - 通常每日由 cron 自动执行(查看 /etc/cron.daily/logrotate)。
- 手动测试:
- 要点
- 为运行用户设置合适的 文件权限(如 myapp:myapp)。
- 若应用不支持信号重载,可在 postrotate 中执行服务重启或使用 copytruncate(有丢日志风险,谨慎使用)。 以上为 logrotate 的标准用法与注意事项。
四 systemd 服务日志与本地检索
- 将 Java 应用托管为 systemd 服务(示例 /etc/systemd/system/myapp.service):
[Unit] Description=My Java App After=network.target [Service] Type=simple User=myapp ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar StandardOutput=journal StandardError=journal SuccessExitStatus=143 Restart=on-failure [Install] WantedBy=multi-user.target - 常用检索
- 实时查看:
sudo journalctl -u myapp.service -f - 按时间:
sudo journalctl -u myapp.service --since "2025-12-01 10:00:00" -u myapp.service --until "2025-12-01 12:00:00" - 按级别:
sudo journalctl -u myapp.service -p err -b
- 实时查看:
- 建议为服务设置 CPU/内存/重启 策略,避免异常退出影响可用性。 以上命令覆盖 journalctl 对 systemd 服务的常用检索场景。
五 集中化日志平台与可视化
- 方案选型
- ELK Stack(Elasticsearch + Logstash + Kibana):采集、存储、检索与可视化一体化。
- Graylog:开箱即用的集中式日志平台,部署与运维相对简单。
- 快速落地 ELK(示例)
- 安装组件:
sudo apt update & & sudo apt install elasticsearch logstash kibana - Logstash 采集文件示例(/etc/logstash/conf.d/java-log.conf)
input { file { path => "/var/log/myapp/*.log" start_position => "beginning" sincedb_path => "/var/lib/logstash/sincedb-myapp" codec => "json_lines" # 若应用输出 JSON;否则用 plain 并配合 grok } } filter { # 如非 JSON,可用 grok 解析;示例模式可按需调整 # grok { match => { "message" => "%{ COMBINEDAPACHELOG} " } } # date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { hosts => ["localhost:9200"] index => "myapp-%{ +YYYY.MM.dd} " } stdout { codec => rubydebug } } - 启动服务:
sudo systemctl start elasticsearch logstash kibana - Kibana 访问 http://localhost:5601 创建索引模式并可视化。
- 安装组件:
- 适用场景
- 多实例、多主机统一检索与告警。
- 长期留存、报表与指标分析。 以上为 ELK 在 Ubuntu 上的基本部署与采集示例。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu中Java日志管理怎么做
本文地址: https://pptw.com/jishu/761741.html
