Overview
미들웨어, 데이터 베이스등과 같은 시스템을 운영하다보면 로그 레벨을 동적으로 변경해야되는 때가 많다. 그럴때마다 설정 파일을 변경하면서 시스템을 내렸다 올렸다는 일은 여간 까다롭거나 비용이 많이 드는 일이 아닐 수 없다. 다행히 Milvus에서는 이런 로그 레벨 수준으로 동적으로 변경 가능하도록 API 제공해주고 있다.
Dynamically Change Log Levels in the Milvus Vector Database
The Milvus vector database adopts the zap logger open sourced by Uber to support dynamically changing log levels while the Milvus service is running.
medium.com
로그 레벨을 이제 동적으로 변경해보자
1. 로그 레벨을 error 로 변경해보자.
[root@localhost ~]# curl -X PUT localhost:9091/log/level -d level=error
{"level":"error"}
마지막 로그 이후에 출력이 멈춘 것을 볼 수 있다.
[root@localhost ~]# docker logs -f 4b2806e514a1
...
2. error 로그를 출력하기 위해서 etcd, minio container를 한번 내려보자
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b2806e514a1 milvusdb/milvus:v2.2.11 "/tini -- milvus run…" 45 minutes ago Up 45 minutes 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp milvus-standalone
53e9f0029dad minio/minio:RELEASE.2023-03-20T20-16-18Z "/usr/bin/docker-ent…" 45 minutes ago Up 45 minutes (healthy) 9000/tcp milvus-minio
c4cb4680b4b7 quay.io/coreos/etcd:v3.5.5 "etcd -advertise-cli…" 45 minutes ago Up 45 minutes 2379-2380/tcp
[root@localhost ~]# docker stop 53e9f0029dad
53e9f0029dad
[root@localhost ~]# docker stop c4cb4680b4b7
c4cb4680b4b7
아래와 같이 로그가 error 로그가 출력되는 것을 볼 수 있다.
[2023/07/12 04:19:32.946 +00:00] [ERROR] [config/etcd_source.go:151] ["can not pull configs"] [error="context deadline exceeded"] [stack="github.com/milvus-io/milvus/internal/config.(*EtcdSource).refreshConfigurationsPeriodically\n\t/go/src/github.com/milvus-io/milvus/internal/config/etcd_source.go:151"]
[2023/07/12 04:19:32.946 +00:00] [ERROR] [config/etcd_source.go:151] ["can not pull configs"] [error="context deadline exceeded"] [stack="github.com/milvus-io/milvus/internal/config.(*EtcdSource).refreshConfigurationsPeriodically\n\t/go/src/github.com/milvus-io/milvus/internal/config/etcd_source.go:151"]
{"level":"warn","ts":"2023-07-12T04:19:32.946Z","logger":"etcd-client","caller":"v3@v3.5.5/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc000511dc0/etcd:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp: lookup etcd on 127.0.0.11:53: no such host\""}
{"level":"warn","ts":"2023-07-12T04:19:32.946Z","logger":"etcd-client","caller":"v3@v3.5.5/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0027601c0/etcd:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp: lookup etcd on 127.0.0.11:53: no such host\""}
디폴트 로그 레벨은 INFO이다 (?)
위에 링크된 블로그 공식 사이트를 들어가보면 Milvus는 기본적으로 INFO 레벨 수준을 출력한다고 기재되어 있다.
정말 그런것일까 증명해보자.
docker-compose로 milvus standalone 설치
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b2806e514a1 milvusdb/milvus:v2.2.11 "/tini -- milvus run…" 45 minutes ago Up 45 minutes 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp milvus-standalone
53e9f0029dad minio/minio:RELEASE.2023-03-20T20-16-18Z "/usr/bin/docker-ent…" 45 minutes ago Up 45 minutes (healthy) 9000/tcp milvus-minio
c4cb4680b4b7 quay.io/coreos/etcd:v3.5.5
출력 로그를 확인해보자
엥? DEBUG까지 출력을 하고 있다. INFO가 디폴트 설정으로 되어 있다는 것은 저 링크가 업데이트가 되지 않았거나 버전 차이일 수도 있다.
[root@localhost ~]# docker logs 4b2806e514a
...
[2023/07/12 03:11:31.579 +00:00] [INFO] [paramtable/hook_config.go:19] ["hook config"] [hook={}]
[2023/07/12 03:11:31.579 +00:00] [INFO] [config/etcd_source.go:145] ["start refreshing configurations"]
[2023/07/12 03:11:31.584 +00:00] [DEBUG] [paramtable/grpc_param.go:238] ["Init client max send size"] [role=indexcoord] [grpc.clientMaxSendSize=104857600]
[2023/07/12 03:11:31.584 +00:00] [DEBUG] [paramtable/grpc_param.go:238] ["Init client max recv size"] [role=indexcoord] [grpc.clientMaxRecvSize=104857600]
...
설정 파일을 확인해보자
docker container안에 들어가서 설정 파일을 출력해보면 etcd는 log레벨이 info로 되어 있지만 시스템 로그 설정은 기본적으로 debug로 되어있다. 영구적으로 변경하기 위해서는 container에 설정 파일을 volumne으로 연결해서로그 레벨을 변경해야할 것이다.
[root@localhost ~]# docker exec -it 4b2806e514a1 /bin/bash
root@4b2806e514a1:/milvus# cat configs/milvus.yaml
# Related configuration of etcd, used to store Milvus metadata & service discovery.
etcd:
endpoints:
- localhost:2379
rootPath: by-dev # The root path where data is stored in etcd
metaSubPath: meta # metaRootPath = rootPath + '/' + metaSubPath
kvSubPath: kv # kvRootPath = rootPath + '/' + kvSubPath
log:
# path is one of:
# - "default" as os.Stderr,
# - "stderr" as os.Stderr,
# - "stdout" as os.Stdout,
# - file path to append server logs to.
# please adjust in embedded Milvus: /tmp/milvus/logs/etcd.log
path: stdout
level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
...
# Configures the system log output.
log:
level: debug # Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
stdout: "true" # default true, print log to stdout
file:
# please adjust in embedded Milvus: /tmp/milvus/logs
rootPath: "" # root dir path to put logs, default "" means no log file will print
maxSize: 300 # MB
maxAge: 10 # Maximum time for log retention in day.
maxBackups: 20
format: text # text/json