首页 > 其他分享 >docker 运维

docker 运维

时间:2024-11-17 23:41:45浏览次数:1  
标签:容器 运维 -- etc loki docker 日志

服务器公网IP

113.45.148.176

mysql初始

数据卷设置my.cnf

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
#collation-connection = utf8mb4_unicode_ci
#注意,这个地方的connection改了的话重启直接就打不开数据库了,需要其他办法改,原理未知
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_general_ci '


检查生效与否
show variables like 'character_set_database';

 

分本地密码和远程密码

image-20230605223611294ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

FLUSH PRIVILEGES;

docker命令

配置docker里的“镜像”的加速器 ##华为没用#

image-20240810222045888

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
      "https://do.nark.eu.org",
      "https://dc.j8.work",
      "https://docker.m.daocloud.io",
      "https://dockerproxy.com",
      "https://docker.mirrors.ustc.edu.cn",
      "https://docker.nju.edu.cn"
  ]
}
EOF


systemctl daemon-reload
systemctl restart docker

服务

image-20230603141938623

image-20230603194146847

镜像

当前容器转换进行 压缩发送接收解压镜像

image-20230626221617303

拉取远程指定版本镜像

image-20230603193238361

指定:tag删除镜像(rmi 也可以直接跟镜像ID)

image-20230603193533866

image-20230603194120394

容器

docker start -ai 命令用于启动一个已经停止的 Docker 容器,并将其附加到当前终端。具体来说:

这个命令通常用于需要与容器进行交互的场景,例如调试或运行需要用户输入的应用程序。

例如,如果你有一个名为 my_container 的容器,你可以使用以下命令启动并附加到它:

docker start -ai my_container

image-20230603195041779

image-20230603195317905

容器开机自启动

docker update --restart=always 容器ID(或者容器名) (容器ID或者容器名根据实际情况修改)

docker run -d --restart always my-container

#和Docker服务开机自动启动 start enable 不是一回事

容器日志

针对不需要保持启动状态的工具容器;运行后查看日志

以下是如何使用docker logs命令的基本示例:

docker logs [容器ID或名称] 1 如果想要实时查看日志,可以加上-f参数,这样日志就会像使用tail -f命令一样实时输出。

docker logs -f [容器ID或名称] 1 如果只想查看最近几行的日志,可以使用--tail参数,后面跟上想查看的行数。

docker logs --tail=[行数] [容器ID或名称] 1 如果需要更详细的日志信息,例如带有时间戳的日志,可以使用--timestamps参数。

docker logs --timestamps [容器ID或名称] 1 如果容器日志非常大,你可能只想查看某个时间段的日志。在这种情况下,可以使用--since参数,后跟一个相对的时间或者一个具体的时间戳。

docker logs --since=30m [容器ID或名称] # 查看30分钟内的日志 docker logs --since="2023-04-01" [容器ID或名称] # 查看指定日期之后的日志 1 2 注意,docker logs命令只能用于显示容器的日志输出,如果容器没有输出日志到stdout和stderr,那么这个命令将不会显示任何信息。

原文链接:https://blog.csdn.net/qq_39354140/article/details/139296043

docker容器数据通信和绑定一致性

-v XXX:XXX 如果没有该目录会默认创建指定目录

但是容器自带的文件,在宿主机上会生成为目录而不是文件

image-20230603195919815

image-20230603201318723

image-20230603202223274

image-20230628223705299

dockerfile命令解析

image-20230628225102703


FROM           指定基础镜像
MAINTAINER     指定作者
RUN             执行参数中定义的命令,构建镜像时需要的命令
EXPOSE         向容器外部公开的端口号
WORKDIR         设置容器内默认工作目录
USER           指定用户
ENTRYPOINT     指定一个容器启动时运行的命令
ENV             设置环境变量
ADD|COPY       复制文件到镜像中(ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包.COPY类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>文件/目录复制到新的一层的镜像内<目标路径>的位置 COPY src dest   或者COPY ["src","dest"])
VOLUME         容器数据卷,向镜像创建的容器添加卷
CMD             容器启动时要运行的命令,可以有多个,但只有最后一个生效

image-20230630153948961

docker指定容器中进程的用户身份

我们可以通过 Dockerfile 中的 USER 命令或者是 docker run 命令的 --user 参数指定容器中进程的用户身份。

docker 已启动容器端口别占用问题

停止docker容器

docker stop container01

commit该docker容器

docker commit container01 new_image:tag

用前一步新生成的镜像重新起一个容器

docker run --name container02 -p 80:80 new_image:tag

dockerfile构建镜像容器启动springboot配置

选择eclipse-temurin 的jdk

springboot 打包跳过测试

 mvn clean package '-Dmaven.test.skip=true'

上传云服务器

编写dockerfile 构建项目镜像 --用底层bootf 所以不用其它Linux

cat > dockerfile << EOF
FROM eclipse-temurin:11-jdk
MAINTAINER XXHR
WORKDIR /springboot
ADD demo-0.0.1-SNAPSHOT.jar app.jar
RUN mkdir tmp
CMD java -jar -Duser.timezone=Asia/Shanghai app.jar
EOF

#其中run和cmd的区别:

image-20240812231238385

构建镜像

docker build -t springapp:1 .
#其中 -t和-f是常使用的参数,-t为指定构建镜像的名字和版本,格式为'name:tag',-f为指定其他目录下的DockerFIle文件。

#我们看到最后还有一个 . 是为了让 Docker 到当前本地目录去寻找 Dockerfile 文件。然后将DockerFile同级目录的所有东西打tar包发送到服务器上,最后利用DockerFile中的其他命令来构建一个镜像。这是一个最简单的命令。

#####不要用你的根目录下,/ 作为PATH因为它会导致生成到您的硬盘驱动器的全部内容传输到服务器。

容器启动

docker run -id -p 9090:9090 -v /springboot/logs:/springboot/logs -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --name springboot springapp:1

docker run -id -p 9090:9090 -v /root/springboot/logs:/springboot/logs -v /etc/localtime:/etc/localtime:ro --name springboot springapp:1

docker exec -it springboot bash

 

mysql容器启动配置

默认文件

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/error.log #得先在宿主身上创建,运行时就不会报错

pid-file=/var/run/mysqld/mysqld.pid

sql_mode='NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'

character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

端口映射是为了方便远程客户端 控制云服务mysql

docker run -id -e MYSQL_ROOT_PASSWORD=123456 -p 3309:3300 -v $(pwd)/data:/var/lib/mysql -v $(pwd)/logs:/logs -v $(pwd)/conf:/etc/mysql/conf.d --name mysqlserver mysql:8.0

docker run -id -u 0 -e MYSQL_ROOT_PASSWORD=123456 -p 3309:3306 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/error.log:/error.log -v /root/mysql/my.cnf:/etc/my.cnf --name sql mysql:5.7.43

#在Linux系统中,配置文件通常位于/etc/my.cnf,/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf。

docker exec -it mysqlserver bash

#docker 先创建宿主机的目录(文件不行),发现是空的再空挂载
如果v的是配置文件,需要先下载好默认(有内容)配置文件且在宿主机创建再挂载;
如果v的是其他文件,需要先在宿主机创建该文件(可以是空)再挂载;
如果v的是目录数据,直接挂载就好了

image-20230605212638705

 

web nginx 容器配置

image-20230629203031310

image-20230629184406852

image-20230629183549753

nginx 配置文件

image-20230629210658147

image-20230629210610462

server {
listen 81; #80不行
server_name localhost; # 修改为docker服务宿主机的ip

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api/ { # api是vue项目里.env.production里的地址
proxy_pass http://123.207.66.117:9090/; # 这里写的是你后端接口的地址
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

 

FROM nginx
MAINTAINER XXHR
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/
COPY dist/ /usr/share/nginx/html/

构建镜像

docker build -t vue:3 .

容器启动

docker run -id -p 81:81 --name vuenginx vue:3

image-20230629213029366

image-20230629213105694

 

docker compose

dc的基本命令

Commands:
attach Attach local standard input, output, and error streams to a service's running container. build Build or rebuild services
config Parse, resolve and render compose file in canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service.
# down Stop and remove containers, networks
events Receive real time events from containers.
exec Execute a command in a running container.
images List images used by the created containers
kill Force stop service containers.
logs View output from containers
ls List running compose projects
# pause Pause services
port Print the public port for a port binding.
# ps -a List containers
pull Pull service images
push Push service images
# restart Restart service containers
# rm Removes stopped service containers
run Run a one-off command on a service.
scale Scale services
#start Start services
stats Display a live stream of container(s) resource usage statistics
#stop Stop services
top Display the running processes
# unpause Unpause services
# up -d Create and start containers
-d-d或--detach: 表示以守护进程的方式运行容器,即在后台运行,不会阻塞终端
version Show the Docker Compose version information
wait Block until the first service container stops
watch Watch build context for service and rebuild/refresh containers when files are updated

#单纯启动alert 和 vector
version: '3'
services:
app:
container_name: springboot
build: . -t springapp
restart: always
ports:
- "9090:9090"
volumes:
- ./springboot/logs:/springboot/logs
- /etc/localtime:/etc/localtime:ro

alertmanager:
container_name: alertmanager
image: prom/alertmanager:latest
restart: always
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
- ./default.tmpl:/etc/alertmanager/template/default.tmpl
- /etc/localtime:/etc/localtime:ro # 必要的

 

curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
太慢使用镜像

git clone https://github.com.cnpmjs.org/docker/compose.git
或者
git clone https://hub.fastgit.org/docker/compose.git
或者
git clone https://gitclone.com/github.com/docker/compose.git

curl -L https://get.daocloud.io/docker/compose/releases/download/2.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

curl -L https://github.com.cnpmjs.org/docker/compose/releases/download/2.24.0/docker-compose-`uname -s``uname -m` > /usr/local/bin/docker-compose

curl -L https://hub.fastgit.org/docker/compose/releases/download/2.24.0/docker-compose-`uname -s`-`uname -m`-o /usr/local/bin/docker-compose

curl -L https://gitclone.com/github.com/docker/compose/releases/download/2.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose



添加可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/dc #并没有必要的,如果需要更短的命令
测试是否安装成功:
docker-compose --version
cker-compose version 1.24.1, build 4667896b


卸载docker compose:
rm -f /usr/local/bin/docker-compose

#监控组件部署
version: '3'
services:


version: '3'
services:
node-exporter:
container_name: node #无所谓
image: prom/node-exporter:latest
restart: always
ports:
- "9100:9100"

prometheus:
container_name: prometheus
image: prom/prometheus:latest
restart: always
user: root
ports:
- "9000:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus-data:/prometheus
- ./node_alert_rule.yml:/etc/prometheus/node_alert_rule.yml

grafana:
container_name: grafana
image: grafana/grafana:latest
restart: always
user: root
ports:
- "3000:3000"
volumes:
- ./grafana-data:/var/lib/grafana

alertmanager:
container_name: alertmanager
image: prom/alertmanager:latest
restart: always
ports:
- "9093:9093"
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml

promethus

Docker部署Prometheus_docker部署普罗米修斯部署-CSDN博客

prometheus浅入_进入 prometheus容器的命令-CSDN博客

image-20240120175330958

docker pull prom/prometheus

docker run -id -u 0 \
-p 9000:9090 \
-v ./prometheus-data:/prometheus \
-v ./prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus

docker exec -it prometheus sh

默认yml

# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ["localhost:9090"]

#配置后
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "node_alert_rule.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]

- job_name: "node" #关注alert_rule关联
static_configs:
- targets: ["123.207.66.117:9100"]

grafana

docker run -id --name grafana -p 3000:3000 grafana/grafana

中文面板 代号:8919 v2020.10.10 Node Exporter Dashboard 220413 ConsulManager自动同步版 | Grafana Labs

监控linux 指标

目标机配置node_exporter 服务 ,建议docker安装/prom/node_exporter

$ vim /etc/systemd/system/node_exporter.service

[Unit]
Description=node_exporter
[Service]
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target#在这组,由enable 触发

修改promethues.yml

- job_name: "linux"
static_configs:
#监控多台服务器
- targets: ["ip1:9100","ip2:port"]
#默认9100

定义告警规则

解析规则

#官方:十分的正确
sum by (instance) (avg by (mode, instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m]))) > 0.8
#其他1 推理得出
1-avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))by (instance) #除,只除idle的结果偏高,cpu有些未使用状态没除去因为在采集数据中没有,是除少了,结果就偏高。

node_alert_rules.yml

groups:
- name: node_alert #无所谓
rules:
- alert: NodeDown
expr: up{job="node"} == 0 #关注关联
for: 5s
labels:
severity: critical
annotations:
summary: instance:{{ $labels.instance }} down
description: "The instance {{ $labels.instance }} 已经宕机5s"

- alert: HostHighCpuLoad
expr: sum by (instance) (avg by (mode, instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m]))) > 0.8
for: 10m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} cpu使用率异常
description: "5分钟内,Cpu平均使用率超过80%,长达10m"
value: "{{ $value }}"

- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 2m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} 内存异常
description: "内存不足10%,长达2m"
value: "{{ $value }}"

- alert: HostUnusualNetworkThroughputOut
expr: sum by (instance) (rate(node_network_transmit_bytes_total[2m])) / 1024 / 1024 > 100
for: 5m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} 网络转发量异常
description: "2分钟内,所有网卡转发速率超100MB/s,长达5m"
value: "{{ $value }}"

- alert: HostUnusualNetworkThroughputIn
expr: sum by (instance) (rate(node_network_receive_bytes_total[2m])) / 1024 / 1024 > 100
for: 5m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} 网络接受量异常
description: "2分钟内,所有网卡接受速率超100MB/s,长达5m"
value: "{{ $value }}"

- alert: HostUnusualDiskReadRate
expr: sum by (instance) (rate(node_disk_read_bytes_total[2m])) / 1024 / 1024 > 50
for: 5m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} 磁盘读取异常
description: "2分钟内,磁盘读取速率超50MB/s,长达5m"
value: "{{ $value }}"

- alert: HostUnusualDiskWriteRate
expr: sum by (instance) (rate(node_disk_written_bytes_total[2m])) / 1024 / 1024 > 50
for: 5m
labels:
severity: warning
annotations:
summary: instance:{{ $labels.instance }} 磁盘写入异常
description: "2分钟内,磁盘写入速率超50MB/s,长达5m"
value: "{{ $value }}"


定义告警媒介规则

global:
resolve_timeout: 5m
smtp_smarthost: "smtp.qq.com:465"
smtp_from: "[email protected]"
smtp_auth_username: "[email protected]"
smtp_auth_password: "pyjbqqkqtyncbcfj"
smtp_require_tls: false
smtp_hello: "Alert"
inhibit_rules:
- source_match:
severity: "critical"
target_match:
severity: "warning"
equal:
- instance
route:
group_by: ["alertname"]
receiver: "email"
group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。时间对的上,计算时间加上for时间,再加上group_wait时间 50s左右
group_interval: 5m #
repeat_interval: 1h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。 同一alert,在发送邮件后时隔一小时再发一次firing邮件
receivers:
- name: "email"
email_configs:
- to: "[email protected]"
send_resolved: true #



global:
resolve_timeout: 5m
smtp_smarthost: "smtp.qq.com:465"
smtp_from: "[email protected]"
smtp_auth_username: "[email protected]"
smtp_auth_password: "pyjbqqkqtyncbcfj" #记得是不是更新下授权码
smtp_require_tls: false
smtp_hello: "Alert"
templates: #添加模板
- "/etc/alertmanager/template/default.tmpl" #指定路径
inhibit_rules:
- source_match:
severity: "critical"
target_match:
severity: "warning"
equal:
- instance
route:
group_by: ["alertname"]
receiver: "all_email"
group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。时间对的上,计算时间加上for时间,再加上group_wait时间 50s左右
group_interval: 5m #
repeat_interval: 1h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。 同一alert,在发送邮件后时隔一小时再发一次firing邮件
routes:
- receiver: log_email
group_wait: 10s
matchers:
- source = "vetor_springboot_log"
- receiver: metric_email
matchers:
- source = "prometheus_node_metric"

receivers:
- name: "log_email"
email_configs:
- to: "[email protected]"
html: '{{ template "log.html" .}}'
headers:
{
Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]",
}
send_resolved: true
- name: "metric_email"
email_configs:
- to: "[email protected]"
html: '{{ template "metric.html" .}}'
headers:
{
Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]",
}
send_resolved: true
- name: "all_email"
email_configs:
- to: "[email protected]"
send_resolved: true

 

监控docker 容器的cadvisor

配置cadvisor 容器在宿主机上 ,大同小异

docker run -d\
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=其他port:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest

你必须知道的容器监控 (2) cAdvisor - EdisonZhou - 博客园 (cnblogs.com)

image-20240303114435488

 

docker -u 权限问题

容器文件权限问题permission denied 由 -u 0 解决,是自己服务器的问题

日志框架

image-20240317112934434

image-20240315104128527

Spring框架默认是用Apache Commons Logging(之前叫做 Jakarta Commons Logging,简称 JCL)门面;

SLF4J:类似于 JCL,Simple Logging Facade for Java (SLF4J) 也只提供了一个日志接口。具体的日志实现是在打包应用程序时所放入的绑定器(例如 slf4j-log4j12-version.jar)来决定的。SLF4J 可以与不同的日志实现工具(例如 log4j)进行绑定和代理工作。

桥接器:有时候,你可能在开发的组件中已经使用了 JCL,或者某些组件直接调用了 java.util.logging(JUL)。此时,你需要一个桥接器(例如 jcl-over-slf4j.jar)将它们的日志输出重定向到 SLF4J。桥接器实际上是一个假的日志实现工具。当你将 jcl-over-slf4j.jar 放入 CLASS_PATH 时,即使某个组件原本是通过 JCL 输出日志的,现在也会被 jcl-over-slf4j “骗到” SLF4J 里,然后 SLF4J 根据绑定器将日志交给具体的日志实现工具。

 

SLF4J (Simple Logging Facade for Java) 是一个日志门面,它允许你在部署时选择不同的日志实现工具。以下是一些常见的 SLF4J 绑定器:

  1. slf4j-nop:这个绑定器不输出任何日志,适用于调试阶段。你可以在 Maven 配置中指定使用 slf4j-nop 作为日志后端实现。

  2. slf4j-simple:这是一个简单的 SLF4J 后端实现,适用于调试。它的功能较少,但足够满足基本需求。你需要在 classpath 下放置 simplelogger.properties 配置文件。

  3. JUL (Java Util Logging):SLF4J 支持将 JUL 作为日志后端。你可以在 Maven 中添加 slf4j-jdk14 依赖,并在 $ {JAVA_HOME}/conf/logging.properties 中配置 JUL。

  4. log4j:log4j 是一个历史悠久的日志框架,许多项目仍在使用它。你可以将 log4j 作为 SLF4J 的后端实现。在 Maven 中添加 slf4j-log4j12 依赖,并在 classpath 下放置 log4j.properties 配置文件。

  5. log4j2:log4j2 是当前最热门的日志组合。你可以将 log4j2 作为 SLF4J 的后端实现。在 Maven 中添加 log4j-slf4j2-impllog4j-core 依赖。

总之,SLF4J 的灵活性使你可以根据需要选择不同的日志实现工具,而无需改变代码。123

总之,使用 SLF4J 的典型搭配是将 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j 绑定器和 log4j 这五个 JAR 放置在 CLASS_PATH 里。

<!-- 与SLF4J的桥接器(也叫适配器)有三个 jul、jcl、早期的log4j,而logback与其没有 -->
<!-- SLF4J 的绑定器有5个,常见的有jul(jdk )、早期的log4j、log4j2,而logback与其没有 -->

Spring Boot 默认使用 SLF4J 作为日志门面,而 Logback 则是其默认的日志实现。 如果比较在意性能,推荐继续使用:Slf4j + Logback

如果你需要切换日志实现,只需要在项目的依赖管理中排除对应的日志实现依赖,并添加你想要的日志框架依赖即可。例如,要使用 Log4j2 而不是 Logback,你可以这样做:

<!--  在 dependencies 部分,排除 spring-boot-starter-logging 和 logback-classic 模块:--> exclusion是排除的意思
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId> <!-- 在上面-logging下了,所以这段可以不要 -->
</exclusion>
</exclusions>
</dependency>


<!-- 添加 Log4j2 依赖,在 Maven 中添加 `log4j-slf4j2-impl` 和 `log4j-core` 依赖。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>


<!-- 添加 Log4j、 log4j 绑定器依赖,或者一步到位在 Maven 中添加 `slf4j-log4j12` 依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>

 

系统默认配置

日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。#缩写包.类名
%msg:日志消息,
%n是换行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n


============================================
#调整输出等级,可以指定包(前2个,算是全局包,多用),也可以是局部包(少用)
logging.level.com.keafmd=trace
#其他功能
spring.profiles.active=dev

#当前项目下生成springboot123.log日志
#logging.file.name=springboot123.log
#logging.file.name=/Users/sang/Documents/javaboy/springboot123.log

#指定springboot.log日志文件的路径位置 时生成默认的spring.log日志文件
#logging.file.path=E:/springboot
logging.file.path=/spring/log

#在控制台输出的日志格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
#指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} === %msg%n

#其他精细化管理
如果想对输出到文件中的日志进行精细化管理,还有如下一些属性可以配置:
logging.logback.rollingpolicy.file-name-pattern:日志归档的文件名,日志文件达到一定大小之后,自动进行压缩归档。
logging.logback.rollingpolicy.clean-history-on-start:是否在应用启动时进行归档管理。
logging.logback.rollingpolicy.max-file-size:日志文件大小上限,达到该上限后,会自动压缩。
logging.logback.rollingpolicy.total-size-cap:日志文件被删除之前,可以容纳的最大大小。
logging.logback.rollingpolicy.max-history:日志文件保存的天数。

 

在 application.properties 中只能实现对日志一些非常简单的配置,如果想实现更加细粒度的日志配置,那就需要使用日志实现的原生配置,例如 Logbackclasspath:logback.xmlLog4jclasspath:log4j.xml 等。如果这些日志配置文件存在于 classpath 下,那么默认情况下,Spring Boot 就会自动加载这些配置文件。

Spring Boot 的日志系统会自动根据 classpath 下的内容选择合适的日志配置,在这个过程中推荐首选 Logback。

日志实现框架logback

等级有 TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,

使用logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能。(区分开发和上线日志)

按等级分类存放,只会方便查看具体的日志信息;而在info 及以上的所有信息方便用于监控错误报警。两种都要实现,设置三个:

  1. info及以上

  2. warn

  3. error

vector抓取日志

注意:vector在修改配置后,再启动时,sinks 有可能会出现问题, 如alert ,grafana 可能会触发两次,解决办法是重启服务器。

 

选型:vector + loki + grafana

下载1

Download | Vector

下载2

curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash -s -- -y --prefix /usr/local  #自定义路径
#官方默认路径

mkdir /var/lib/vector

mkdir /etc/vector/vector.yaml

vector 配置文件 接入springboot日志

#                                    __   __  __
# \ \ / / / /
# \ V / / /
# \_/ \/
#
# V E C T O R
# Configuration
#
# ------------------------------------------------------------------------------
# Website: https://vector.dev
# Docs: https://vector.dev/docs
# Chat: https://chat.vector.dev
# ------------------------------------------------------------------------------

# Change this to use a non-default directory for Vector data storage:
# data_dir: "/var/lib/vector"
sources:
springboot_log1:
type: file
glob_minimum_cooldown_ms: 1000
ignore_older_secs: 600
include:
- /root/build/springboot/logs/log_error.log
multiline:
start_pattern: "^ERROR"
mode: "continue_through"
condition_pattern: '^[^E]'
timeout_ms: 1000
max_line_bytes: 102400
max_read_bytes: 3072
# offset_key: offset
read_from: beginning

# See the Vector Remap Language reference for more info: https://vrl.dev
transforms:
error_log_json1:
type: "remap"
inputs:
- springboot_log1
source: |
del(.source_type)
.labels = del(.)
.labels.source = "vetor_springboot_log"
.labels.filename = del(.labels.file)
.labels.gathertime = format_timestamp!(del(.labels.timestamp),"%F %T%.6f","Asia/Shanghai")
.annotations = {}
.annotations.info = del(.labels.message)
timezone: "Asia/Shanghai"
sinks:
print:
type: "http"
#type: "console"
inputs: ["error_log_json1"]
uri: "http://123.207.66.117:9093/api/v2/alerts"
encoding:
codec: "json"

# Vector's GraphQL API (disabled by default)
# Uncomment to try it out with the `vector top` command or
# in your browser at http://localhost:8686
#api:
# enabled: true
# address: "127.0.0.1:8686"

loki 存储日志

设置源

# nano /etc/yum.repos.d/grafana.repo
[grafana]
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt


yum clean all
yum makecache
yum install loki --nogpgcheck #默认所有版本中最新的


/etc/loki/config.yml

一开始默认接受无序的日志,但是unix时间戳不能太早

Loki 的 API 对发送的 JSON 格式有一些具体要求。以下是主要的要求和注意事项:

  1. 基本结构

    • JSON 数据必须包含一个 streams 数组,每个元素代表一个日志流。

    • 每个日志流包含两个部分:streamvalues

  2. stream 部分

    • stream 是一个键值对对象,用于指定日志流的标签(labels)。标签是 Loki 用来索引日志的元数据。

  3. values 部分

    • values 是一个二维数组,每个元素是一个包含两个字符串的数组。

    • 第一个字符串是 Unix 时间戳(以纳秒为单位),第二个字符串是日志消息。

以下是一个示例 JSON 格式:

{
"streams": [
{
"stream": {
"label1": "value1",
"label2": "value2"
},
"values": [
["<timestamp>", "log message 1"],
["<timestamp>", "log message 2"]
]
}
]
}
  1. 时间戳

    • 时间戳必须是 Unix 时间戳,并且以纳秒为单位。

  2. 标签

    • 标签的键和值必须是字符串类型。

  3. 日志消息

    • 日志消息必须是字符串类型。

确保你的 JSON 数据符合这些要求,这样 Loki 才能正确解析和存储日志条目12

文档:Local | Grafana Loki documentation

 

记得修改/etc/loki/config.yml ,存储chunks 不能在/tmp下,修改配置文件在/var/loki下 记得chown loki:loki /var/loki ,因为

确保 Loki 进程对 /var/loki/chunks 目录有写入权限。Loki 进程用户就是loki

v3.0
auth_enabled: false #认证被禁用。

server:
http_listen_port: 3100#HTTP 服务器监听端口为 3100。
grpc_listen_port: 9096#gRPC 服务器监听端口为 9096。

common:
instance_addr: 127.0.0.1 # 实例地址设置为本地地址。
path_prefix: /tmp/loki #Loki 存储的基础目录 ,以下都在/tmp/loki 下面 *****改为/var/loki*****s
#drwxr-xr-x 2 loki loki 40 Sep 5 21:34 compactor
##drwxr-xr-x 2 loki loki 40 Sep 5 21:34 rules
#drwxr-xr-x 7 loki loki 140 Sep 5 21:34 tsdb-shipper-active
#drwxr-xr-x 2 loki loki 40 Sep 5 21:34 tsdb-shipper-cache
#drwxr-xr-x 3 loki loki 80 Sep 5 21:59 wal
[root@hcss-ecs-bfc0 loki]#
storage: #文件系统存储配置
filesystem:
chunks_directory: /tmp/loki/chunks #存储块文件的目录。 ***** 改为/var/loki*****
rules_directory: /tmp/loki/rules #存储规则文件的目录。 就是索引文件。 ***** 改为/var/loki*****
replication_factor: 1 # 数据不进行复制(单实例)。
ring: # 环配置
kvstore: # 键值存储配置
store: inmemory # 键值存储在内存中。

query_range: #
results_cache: #
cache: #
embedded_cache: #
enabled: true #
max_size_mb: 100 #

schema_config: #schema_config 模式配置列表 是 Loki 用来定义数据存储和索引方式的配置部分。它包含多个 configs,每个 config 定义了从某个日期开始生效的存储和索引配置。
configs: #配置定义了索引文件的前缀和周期。索引文件用于加速查询操作,存储了日志数据的元数据。
- from: 2020-10-24 #模式从这个日期开始生效。
store: tsdb #存储类型为 TSDB(时间序列数据库)。
object_store: filesystem # 对象存储为文件系统。
schema: v13 #模式版本为 v13。
index:
prefix: index_ #prefix: index_ ,定义了索引文件的前缀。这个前缀会被添加到索引文件的名称前面,以便于识别和管理。例如,如果前缀是 index_,那么生成的索引文件可能会被命名为 index_2024-09-05。
period: 24h #解释: period 定义了索引文件的时间周期。作用: 这个周期决定了每个索引文件覆盖的时间范围。在这个例子中,周期是 24h,意味着每个索引文件包含 24 小时内的索引数据。这样可以确保索引文件不会过大,同时也便于管理和查询。

ruler:
alertmanager_url: http://localhost:9093

frontend:
encoding: protobuf

# By default, Loki will send anonymous, but uniquely-identifiable usage and configuration
# analytics to Grafana Labs. These statistics are sent to https://stats.grafana.org/
#
# Statistics help us better understand how Loki is used, and they show us performance
# levels for most users. This helps us prioritize features and documentation.
# For more information on what's sent, look at
# https://github.com/grafana/loki/blob/main/pkg/analytics/stats.go
# Refer to the buildReport method to see what goes into a report.
#
# If you would like to disable reporting, uncomment the following lines:
#analytics:
# reporting_enabled: false

path_prefix: /tmp/loki 下有这些文件

  1. 块文件(Chunks):

    • 这些文件存储了实际的日志数据。每个块文件通常是一个压缩文件,包含一段时间内的日志数据。文件名通常是根据块的哈希值生成的。

  2. 租户目录(Tenant Directories):

  3. 元数据文件(Metadata Files):

    • 这些文件包含关于块文件的元数据,例如 loki_cluster_seed.json。这些文件用于管理和查找块文件。

vector 向loki发送数据:

#                                    __   __  __
# \ \ / / / /
# \ V / / /
# \_/ \/
#
# V E C T O R
# Configuration
#
# ------------------------------------------------------------------------------
# Website: https://vector.dev
# Docs: https://vector.dev/docs
# Chat: https://chat.vector.dev
# ------------------------------------------------------------------------------

# Change this to use a non-default directory for Vector data storage:
# data_dir: "/var/lib/vector"
sources:
springboot_log1:
type: file
glob_minimum_cooldown_ms: 1000
ignore_older_secs: 600
include:
- /root/build/springboot/logs/log_error.log
multiline:
start_pattern: "^ERROR"
mode: "continue_through"
condition_pattern: '^[^E]'
timeout_ms: 1000
max_line_bytes: 102400
max_read_bytes: 3072
# offset_key: offset
read_from: beginning

# See the Vector Remap Language reference for more info: https://vrl.dev
transforms:
error_log_json_toloki:
type: remap
inputs: [springboot_log1]
source: |
del(.source_type)
.timestamp = parse_timestamp!(.timestamp, format: "%Y-%m-%dT%H:%M:%S%.fZ")

error_log_json_toalert:
type: "remap"
inputs:
- springboot_log1
source: |
del(.source_type)
.labels = del(.)
.labels.source = "vetor_springboot_log"
.labels.filename = del(.labels.file)
.labels.gathertime = format_timestamp!(del(.labels.timestamp),"%F %T%.6f","Asia/Shanghai")
.annotations = {}
.annotations.info = del(.labels.message)
timezone: "Asia/Shanghai"

sinks:
loki_sink:
type: loki
inputs: [error_log_json_toloki]
endpoint: "http://localhost:3100"
labels:
job: "vector"
encoding:
codec: "json"
healthcheck: false

alert_sink:
type: "http"
#type: "console"
inputs: ["error_log_json_toalert"]
uri: "http://113.45.148.176:9093/api/v2/alerts"
encoding:
codec: "json"

 

安装梳理

yum docker

只在/usr/bin  
/usr/lib/systemd/system/docker.service
有自己yml
service enable start

 

dc

文章说放入/usr/local/bin

curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加可执行权限: sudo chmod +x /usr/local/bin/docker-compose 创建软链: sudo ln -s /usr/local/bin/docker-compose /usr/bin/dc #并没有必要的,如果需要更短的命令 /usr/local/bin/和/usr/bin 都有 测试是否安装成功: docker-compose --version cker-compose version 1.24.1, build 4667896b

卸载docker compose: rm -f /usr/local/bin/docker-compose

在有docker-compose配置文件的地方使用dc

 

vector

curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash -s -- -y --prefix /usr/local  文档就是这么写的

但是vector 命令在/usr/local/bin/下

 

yum loki

是加入grafana 的repo

只在/usr/bin

有自己yml

[root@hcss-ecs-bfc0 ~]# yum install loki --nogpgcheck Last metadata expiration check: 0:16:00 ago on Wed 21 Aug 2024 04:48:28 PM CST. Dependencies resolved. ================================================================================================================================================================================================================ Package Architecture Version Repository Size ================================================================================================================================================================================================================Installing: loki x86_64 3.1.1-1 grafana 22 M

Transaction Summary ================================================================================================================================================================================================================Install 1 Package

Total size: 22 M Installed size: 73 M Is this ok [y/N]: y Downloading Packages: [SKIPPED] loki-3.1.1.x86_64.rpm: Already downloaded Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : loki-3.1.1-1.x86_64 1/1 Running scriptlet: loki-3.1.1-1.x86_64 1/1 Post Install of a clean install Reload the service unit from disk Unmask the service Set the preset flag for the service unit Set the enabled flag for the service unit Created symlink /etc/systemd/system/multi-user.target.wants/loki.service → /etc/systemd/system/loki.service.

Verifying : loki-3.1.1-1.x86_64 1/1

Installed: loki-3.1.1-1.x86_64

Complete!

/etc/systemd/system/loki.service 和 /usr/lib/systemd/system/docker.service yum 安装时service存储在不一样位置FUCK
提示:
/usr/lib/systemd/system:
这个目录包含由软件包管理器(如 YUM、DNF、RPM 等)安装的单元文件。
这些文件通常由操作系统供应商或软件包提供商提供,不建议手动修改。

/etc/systemd/system:
这个目录用于存放系统管理员手动创建或修改的单元文件。
这些文件具有更高的优先级,可以覆盖 /usr/lib/systemd/system 中的同名单元文件。
简单来说,/usr/lib/systemd/system 是系统默认的单元文件存放位置,而 /etc/systemd/system 则是用于本地配置和自定义的单元文件存放位置。



service enable start

有自己的 /usr/bin/loki -config.file /etc/loki/config.yml yum install (源下载,或则rpm安装包)自带配置文件, wget curl 需要手动

总结 yum install (源下载,或则rpm安装包)自带配置文件及service,有service 且需要 enable再 start ;

wget curl 需要手动配置(下载)yml,也可同时创建service ;

即都可service

 

标签:容器,运维,--,etc,loki,docker,日志
From: https://www.cnblogs.com/jiayouxhr/p/18551421

相关文章

  • 为正在运行的 Docker 容器重启策略,以提高服务的可用性
    为正在运行的Docker容器重启策略,以提高服务的可用性。为正在运行的Docker容器添加--restart=always--restart=always是Docker中一个常用的参数,用来设置容器的重启策略。它的作用是确保容器在一定条件下能够自动重启,以提高服务的可用性。方法:直接修改配置步骤1:查看......
  • 使用 Docker 部署 Next Terminal 轻量级堡垒机
    1)NextTerminal 介绍官网:https://next-terminal.typesafe.cn/GitHub:https://github.com/dushixiang/next-terminal想必经常玩服务器的都了解过 堡垒机,类似于跳板机,但与跳板机的侧重点不同。堡垒机的主要功能是控制和监控对内部网络的远程访问。它提供严格的访问控制、会话审......
  • #渗透测试#SRC漏洞挖掘#网络运维# 黑客脚本编写03之脚本参数的传递和数学运算
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。                            ......
  • docker运行rabbitmq,mq用户以及vhost的持久化方法
    一、编写dockerfile文件,配置需要的插件vimpackage/dockerfile-rabbitmq.yamlFROMrabbitmq:3.8.5WORKDIR/var/lib/rabbitmqCOPYrabbitmq_delayed_message_exchange-3.8.0.ez/opt/rabbitmq/plugins/RUNchownrabbitmq:rabbitmq/opt/rabbitmq/plugins/rabbitmq_delayed_......
  • Docker部署Redis哨兵
    哨兵,英文名Sentinel,是一个分布式系统,用于对主从结构中的每一台服务器进行监控,当主节点出现故障后通过投票机制来挑选新的主节点,并且将所有的从节点连接到新的主节点上。RedisSentinel包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Senti......
  • 运维开发之脚本语言(Script Language for Operations and Development)
     ......
  • 飞牛云fnOS本地部署1Panel服务器运维管理面板并搭建Halo个人博客
    ......
  • 云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
    背景如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当时使用的是docker-compose在单......
  • docker安装单机版redis
    Docker安装Redis方法一、dockerpullredis查找DockerHub上的redis镜像#dockersearchredis这里我们拉取官方的镜像,标签为latest#dockerpullredis:latest(第一次启动Docker-Redis主要是查看Docker里面Redis的默认配置,数据位置,日志位置,配置文件位置)#dockerrun-it......
  • docker容器镜像的制作、使用以及传递
    目录制作容器镜像使用Dockerfile制作镜像准备所需文件构建镜像怎么不使用基础镜像来构建容器镜像使用容器镜像传递容器镜像这篇文章讨论一下怎么使用docker制作容器镜像,容器镜像的使用,以及怎么传递容器镜像。制作容器镜像docker制作容器镜像推荐的方法就是使用Doc......