Sentry、Loki 轻量级日志系统部署及应用-pudn.com
上面链接版本比较新, 用新的docker plugin插件和配置
Java spring在docker运行,做了logbck后发现日志不输出到容器里目录(挂载目录)而是通过docker log 查看或者还要在pom.xml下加docker插件依赖,很是麻烦
最后面附上 loki-local-config.yaml和promtail-docker-config.yaml配置文件
普通收集loki+grafana+promtail
loki进行日志聚合处理 类似elk中的es
promtail是日志收集,类似elk中的logstash filebeat等,如果是只收集docker容器的日志则可以用loki的docker plugin替代
grafana是日志显示,类似elk中的kibana,可以通过各种标签和表达式过滤显示日志
version: "3"
services:
loki:
image: grafana/loki
container_name: loki
restart: always
ports:
- "3100:3100"
volumes:
- $PWD:/etc/loki
command: -config.file=/etc/loki/loki-local-config.yaml
promtail:
image: grafana/promtail
container_name: promtail
restart: always
volumes:
- $PWD:/etc/promtail #当前目录下挂载对应
- /app/promtail:/opt #挂载日志到容器1 ,1和2按其配置选择
- /app/promtail/log:/var/log #挂载挂载日志到容器2
command:
-config.file=/etc/promtail/promtail-docker-config.yaml
grafana:
image: grafana/grafana:master
restart: always
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
ports:
- 3000:3000
docker-compose -f loki.yml up -d
安装loki的docker plugin
旧版本
docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
新版本插件(loki2.2.1可以,2.2.1+没测 )
默认安装
docker plugin install grafana/loki-docker-driver:main --alias loki --grant-all-permissions
#指定仓库地址下载安装
docker plugin install registry.docker.com/grafana/loki-docker-driver:main --alias loki --grant-all-permissions
docker版本13安装失败了,18 19正常
两种方式 全局和指定容器
- 配置daemon.json,收集此后创建的所有容器的日志(注意,是配置daemon.json后重启docker服务后创建的容器才会把日志输出到loki)。
- 新建容器时指定logging类型为loki,这样只有指定了logging的容器才会输出到loki
全局收集配置
编辑daemon.json。linux下默认路径是/etc/docker/daemon.json (需要sudo), windows则默认是%userprofile%\.docker\daemon.json
{
"log-driver": "loki",
"log-opts": {
"loki-url": "http://YOUR_IP:3100/loki/api/v1/push",
"max-size": "50m",
"max-file": "10"
},
"registry-mirrors": ["https://registry.docker-cn.com"]
}
记得把YOUR_IP换成loki所在主机的IP,一般都是本机的局域网地址,如果loki映射的端口换了记得这里也需要换。镜像仓库地址也可以换成自己云服务的。
其中max-size表示日志文件最大大小,max-file表示最多10个日志文件,都是对单个容器来说的。
然后重启docker服务。
sudo systemctl restart docker
在此之后创建的容器默认都会把日志发送到loki。
如果不全局配置,而只想特定的容器进行日志收集,则根据启动容器的方式,有两种配置方法。
docker run配置日志输出到loki
通过docker run启动容器,可以通过--log-driver来指定为loki。示例如下
docker run --rm --name=grafana --log-driver=loki --log-opt loki-url="http://YOUR_IP:3100/loki/api/v1/push" --log-opt max-size=50m --log-opt max-file=10 grafana/grafana
--log-driver=loki指定日志驱动器为loki
--log-opt loki-url则指定了loki的url
--log-opt max-size日志最大大小
--log-opt max-file日志文件最大数量
docker-compose 配置日志输出到loki
docker-compose 小于3.4可以对需要日志输出的配置添加配置如下
每个容器服务加一个,例如
version: "3"
services:
promtail:
image: grafana/promtail
container_name: promtail
restart: always
volumes:
- $PWD:/etc/promtail
- /app/promtail:/opt
- /app/promtail/log:/var/log
command:
-config.file=/etc/promtail/promtail-docker-config.yaml
logging:
driver: loki
options:
loki-url: "http://123.123.123.123:3100/loki/api/v1/push"
max-size: "50m"
max-file: "10"
注意:max-size和max-file这里需要加引号
对于3.4极其以上版本可以通过定义模板来减少代码量
version: "3.4"
x-logging:
&loki-logging
driver: loki
options:
loki-url: "http://YOUR_IP:3100/loki/api/v1/push"
max-size: "50m"
max-file: "10"
services:
host:
container_name: grafana
image: grafana/grafana
environment:
- TZ=Asia/Shanghai
- LANG=zh_CN.UTF-8
logging: *loki-logging
&loki-logging表示定义模板
*loki-logging表示引用模板。对于多个服务就只需要对应加上一行 logging: *loki-logging 即可。相比之前的版本可谓是大大简化了
下面grafana 配置loki 自带查询示例 ,loki文档LogQL - 《Loki Document》 - 书栈网 · BookStack
网友翻译的中文查询
最后一图
同名服务或者容器的会全显示日志,例如名字:a 会显示所有a服务或容器的日志 不分主机
主机的会显示这个主机所有发过来的日志,例如主机b 会显示b主机下所有传过来的服务或者容器
附上loki-local-config.yaml
这个好像不是最新版 ,可以看官方配置
auth_enabled: false
server:
http_listen_port: 3100 #端口
ingester:
lifecycler:
address: 127.0.0.1 #ip
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
schema_config:
configs:
- from: 2018-04-15
store: boltdb
object_store: filesystem
schema: v9
index:
prefix: index_
period: 168h #保存时间 删除索引
storage_config:
boltdb:
directory: /tmp/loki/index
filesystem:
directory: /tmp/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0
table_manager:
chunk_tables_provisioning:
inactive_read_throughput: 0
inactive_write_throughput: 0
provisioned_read_throughput: 0
provisioned_write_throughput: 0
index_tables_provisioning:
inactive_read_throughput: 0
inactive_write_throughput: 0
provisioned_read_throughput: 0
provisioned_write_throughput: 0
retention_deletes_enabled: true #删除日志 下面是保存时间
retention_period: 168h
loki2.2.1的 loki.yml配置文件(和loki-local-config.yaml这个一样改个文件名就行)
2.2.1+以上的没试过这配置文件
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed
max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h
chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
max_transfer_retries: 0 # Chunk transfers disabled
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-shipper-active
cache_location: /loki/boltdb-shipper-cache
cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
shared_store: filesystem
filesystem:
directory: /loki/chunks
compactor:
working_directory: /loki/boltdb-shipper-compactor
shared_store: filesystem
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
ruler:
storage:
type: local
local:
directory: /loki/rules
rule_path: /loki/rules-temp
alertmanager_url: http://localhost:9093
ring:
kvstore:
store: inmemory
enable_api: true
2.6.1以上的loki.yml配置文件。参考旧配置文件和官方下的配置结合 终于启动成功
loki/cmd/loki at main · grafana/loki · GitHub官方配置参考
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/boltdb-shipper-active
cache_location: /loki/boltdb-shipper-cache
cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space
shared_store: filesystem
filesystem:
directory: /loki/chunks
compactor:
working_directory: /loki/boltdb-shipper-compactor
shared_store: filesystem
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
ruler:
alertmanager_url: http://localhost:9093
promtail-docker-config.yaml
server:
http_listen_port: 0
grpc_listen_port: 0
positions:
filename: /etc/promtail/positions.yaml # 游标记录上一次同步位置
sync_period: 10s #10秒钟同步一次
clients:
- url: http://x.x.x.x:3100/loki/api/v1/push
scrape_configs:
- job_name: test-java-log
static_configs:
- targets:
- localhost
labels:
job: test
#name: tt #多可以命名几个
__path__: /opt/*.log # docker运行时已经把宿主机的目录 /opt/ 映射给了promtail 容器的 /opt/,所以这个地方可以直接访问log文件