로그 공간 관리 실제 응용

4130 단어 로그docker기술

로그 공간 관리 실제 응용


끌어내다


최근 서버 공간이 부족하다는 경고가 자주 발생하고 있습니다. 로그 점용을 배제한 결과 Docker 용기를 사용하는 서버 공간이 로그 점용의 2배에 달하는 것으로 분석되었습니다. 시스템 공간을 관찰한 결과
 df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       50G  47.4G   2.5G   95% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            988M   12K  988M   1% /dev
tmpfs           201M  476K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none           1001M  164K 1001M   1% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdf1      493G  4.6G  463G   1% /Sioeye

전체 xvda1 볼륨의 공간이 부족함을 알 수 있습니다.docker 표준 출력 json 로그 보기가 가득 찼습니다.
ll -h /var/lib/docker/containers/*/*-json.log
-rw-r----- 1 root root 13.8G Oct 11 14:00 /var/lib/docker/containers/2b6643f688a5234165fa1c3ad151f50bc4e7e4126020037584a0a39597d63f73/2b6643f688a5234165fa1c3ad151f50bc4e7e4126020037584a0a39597d63f73-json.log
-rw-r----- 1 root root 7.7G Oct 11 14:01 /var/lib/docker/containers/331768f0a8f5461a433cd317108be3703c5c2d0fa587596cb55545d3d91b1f06/331768f0a8f5461a433cd317108be3703c5c2d0fa587596cb55545d3d91b1f06-json.log
-rw-r----- 1 root root 12.4G Oct 11 13:59 /var/lib/docker/containers/8b78072e9819975ced653883b53e905bc1bab7dced597121c62264aa97835479/8b78072e9819975ced653883b53e905bc1bab7dced597121c62264aa97835479-json.log

세 용기의 표준 출력 로그가 대량의 공간을 차지하는 것을 발견할 수 있다.

설명하다


Docker가 로그를 처리할 때 대부분 Docker logs 명령을 사용합니다. Docker가 기본적으로 사용하는 log-driver는 json-file이기 때문에 Docker는 모든 용기 프로세스의 stdOUTS와 stdERR를 포착하여 디스크 파일에 저장합니다.json.Dockerlogs 명령 질의는 log에서 사용할 수 있습니다.
그러나 우리가 로그를 처리할 때 응용 프로그램 로그를 로그 파일에 기록하고 호스트에 마운트했기 때문에docker의 json-file 로그는 전체 로그를 중복 기록하는 것으로 공간 낭비를 초래하는 것과 같다.

처리하다


이 때 json-file을 직접 삭제할 수 있습니다. 파일을 직접 삭제할 수 없습니다. 삭제한 후 차지하는 공간이 방출되지 않습니다. 이것은 Linux나 Unix 시스템에서 rm나 파일 관리자를 통해 파일을 삭제하면 파일 시스템의 디렉터리 구조에서 링크가 해제되기 때문입니다.그러나 만약 파일이 열려 있다면, 프로세스는 이 파일을 읽을 수 있고, 디스크 공간도 계속 차지할 것이다
올바른 자세는 >*-json입니다.log, 물론 rm를 통해 삭제한 후docker를 다시 시작할 수 있습니다

해결하다


정시 스크립트를 통해 일정 크기를 초과한 json을 삭제합니다.log
실현은 다음과 같다.
#!/bin/bash 
# docker   
container_path=/var/lib/docker/containers 
for container_shortid in $(docker ps -a -q);do 
    container_id=$(docker inspect -f '``.`Id`' $container_shortid)
    [ -f ${container_path}/${container_id}/${container_id}-json.log ] || continue 
    log_size=$(ls -l ${container_path}/${container_id}/${container_id}-json.log | awk '{print $5}')
    #log size great than 1G , 
    if [ ${log_size} -gt 1073741824 ] ;then
       echo "$(docker inspect -f '``.`Name`' ${container_id}) ${container_id}-json.log $(date +%F\ %T) size is:  $[${log_size}/1073741824]G $[${log_size}%1073741824/1048576]M $[${log_size}%1073741824%1048576/1024]K $[${log_size}%1073741824%1048576%1024]B = $(echo "scale=2;${log_size}/1073741824" | bc)G "
       : > ${container_path}/${container_id}/${container_id}-json.log
    fi
done

출력:/microsrv_zuul 3d03e47c87df387e8e963b854cc3de37b310f03ffcf36a476b2191388c8fd74e-json.log 2017-10-13 05:32:41size is:   3G 884M 973K 59B = 3.86G
crontab를 매일 추가하면 됩니다.

좋은 웹페이지 즐겨찾기