服务器公网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';
分本地密码和远程密码
ALTER 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里的“镜像”的加速器 ##华为没用#
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
服务
镜像
当前容器转换进行 压缩发送接收解压镜像
拉取远程指定版本镜像
指定:tag删除镜像(rmi 也可以直接跟镜像ID)
容器
docker start -ai
命令用于启动一个已经停止的 Docker 容器,并将其附加到当前终端。具体来说:
-
-a
或--attach
:将容器的标准输入、输出和错误流附加到当前终端。这意味着你可以在终端中看到容器的输出,并与容器进行交互。 -
-i
或--interactive
:保持标准输入流打开,这样你可以在终端中输入命令并与容器进行交互123。 下面的-i是错的, -d就够了
这个命令通常用于需要与容器进行交互的场景,例如调试或运行需要用户输入的应用程序。
例如,如果你有一个名为 my_container
的容器,你可以使用以下命令启动并附加到它:
docker start -ai my_container
容器开机自启动
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 如果没有该目录会默认创建指定目录
但是容器自带的文件,在宿主机上会生成为目录而不是文件
dockerfile命令解析
FROM 指定基础镜像
MAINTAINER 指定作者
RUN 执行参数中定义的命令,构建镜像时需要的命令
EXPOSE 向容器外部公开的端口号
WORKDIR 设置容器内默认工作目录
USER 指定用户
ENTRYPOINT 指定一个容器启动时运行的命令
ENV 设置环境变量
ADD|COPY 复制文件到镜像中(ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包.COPY类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>文件/目录复制到新的一层的镜像内<目标路径>的位置 COPY src dest 或者COPY ["src","dest"])
VOLUME 容器数据卷,向镜像创建的容器添加卷
CMD 容器启动时要运行的命令,可以有多个,但只有最后一个生效
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的区别:
构建镜像
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的是目录数据,直接挂载就好了
web nginx 容器配置
nginx 配置文件
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
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博客
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)
docker -u 权限问题
容器文件权限问题permission denied 由 -u 0 解决,是自己服务器的问题
日志框架
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 绑定器:
-
slf4j-nop:这个绑定器不输出任何日志,适用于调试阶段。你可以在 Maven 配置中指定使用
slf4j-nop
作为日志后端实现。 -
slf4j-simple:这是一个简单的 SLF4J 后端实现,适用于调试。它的功能较少,但足够满足基本需求。你需要在 classpath 下放置
simplelogger.properties
配置文件。 -
JUL (Java Util Logging):SLF4J 支持将 JUL 作为日志后端。你可以在 Maven 中添加
slf4j-jdk14
依赖,并在$ {JAVA_HOME}/conf/logging.properties
中配置 JUL。 -
log4j:log4j 是一个历史悠久的日志框架,许多项目仍在使用它。你可以将 log4j 作为 SLF4J 的后端实现。在 Maven 中添加
slf4j-log4j12
依赖,并在 classpath 下放置log4j.properties
配置文件。 -
log4j2:log4j2 是当前最热门的日志组合。你可以将 log4j2 作为 SLF4J 的后端实现。在 Maven 中添加
log4j-slf4j2-impl
和log4j-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 中只能实现对日志一些非常简单的配置,如果想实现更加细粒度的日志配置,那就需要使用日志实现的原生配置,例如 Logback
的 classpath:logback.xml
,Log4j
的 classpath:log4j.xml
等。如果这些日志配置文件存在于 classpath 下,那么默认情况下,Spring Boot 就会自动加载这些配置文件。
Spring Boot 的日志系统会自动根据 classpath 下的内容选择合适的日志配置,在这个过程中推荐首选 Logback。
日志实现框架logback
等级有 TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,
使用logback-spring.xml:日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能。(区分开发和上线日志)
按等级分类存放,只会方便查看具体的日志信息;而在info 及以上的所有信息方便用于监控错误报警。两种都要实现,设置三个:
-
info及以上
-
warn
-
error
vector抓取日志
注意:vector在修改配置后,再启动时,sinks 有可能会出现问题, 如alert ,grafana 可能会触发两次,解决办法是重启服务器。
选型:vector + loki + grafana
下载1
下载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 格式有一些具体要求。以下是主要的要求和注意事项:
-
基本结构:
-
JSON 数据必须包含一个
streams
数组,每个元素代表一个日志流。 -
每个日志流包含两个部分:
stream
和values
。
-
-
stream
部分:-
stream
是一个键值对对象,用于指定日志流的标签(labels)。标签是 Loki 用来索引日志的元数据。
-
-
values
部分:-
values
是一个二维数组,每个元素是一个包含两个字符串的数组。 -
第一个字符串是 Unix 时间戳(以纳秒为单位),第二个字符串是日志消息。
-
以下是一个示例 JSON 格式:
{
"streams": [
{
"stream": {
"label1": "value1",
"label2": "value2"
},
"values": [
["<timestamp>", "log message 1"],
["<timestamp>", "log message 2"]
]
}
]
}
-
时间戳:
-
时间戳必须是 Unix 时间戳,并且以纳秒为单位。
-
-
标签:
-
标签的键和值必须是字符串类型。
-
-
日志消息:
-
日志消息必须是字符串类型。
-
确保你的 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 下有这些文件
-
块文件(Chunks):
-
这些文件存储了实际的日志数据。每个块文件通常是一个压缩文件,包含一段时间内的日志数据。文件名通常是根据块的哈希值生成的。
-
-
租户目录(Tenant Directories):
-
元数据文件(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