• 售前

  • 售后

热门帖子
入门百科

关于PostgreSQL错误日志与慢查询日志收集

[复制链接]
公务员老虫叭 显示全部楼层 发表于 2021-10-26 14:11:41 |阅读模式 打印 上一主题 下一主题
PostgreSQL错误日志与慢查询日志对于线上体系分析、问题预警、问题排查起到非常紧张的作用,在此不做赘述。
此文档纪录错误日志与慢查询日志的网络、分析与存储展示的方法。
一、总体思绪

PostgreSQL日志输出可以配置多种多样的格式,其中以csvlog格式输出的日志信息最全面。但是CSV日志只能以本地文件的方式网络,不能直接写入网络,实时上传日志服务器。
日志网络:

PostgreSQL服务器分布在差别的机器,我们利用rsyslog客户端-服务器的方式来网络日志到日志服务器。详细方法:在PostgreSQL服务器部署客户端,在日志服务器部署服务器,客户端监控日志文件的厘革,实时将新增日志上传到服务器,服务器根据差别客户端上传的日志,分别纪录在差别的文件中。
此方法的好处是在PostgreSQL服务器本地可以生存一份原始的完备的csv日志,供全量信息查察与分析。
日志分析:

利用Logstash举行日志分析,Logstash是一个开源数据网络引擎,具有实时管道功能。Logstash可以动态地将来自差别文件的数据统一起来,举行数据筛选洗濯,并将数据标准化到你所选择的目标地。
日志存储展示:

利用传统的Elasticsearch举行数据存储,Kibana举行数据展示。
二、rsyslog服务器端配置

新增以下内容到rsyslog配置文件/etc/rsyslog.conf,并重启rsyslog服务。
  1. $PreserveFQDN on   #用于正确的获取主机名
  2. $FileOwner root   #存储的文件属主
  3. $FileGroup root   #文件属主
  4. $FileCreateMode 0644 #生成的文件权限
  5. $DirCreateMode 0755 #生成的目录权限
  6. $Umask 0022
  7. $PrivDropToUser root  #可以删除日志的用户
  8. $PrivDropToGroup root  #可以删除日志的用户组
  9. module(load="imuxsock")
  10. module(load="imklog")
  11. module(load="imudp")
  12. #input(type="imudp" port="514")
  13. module(load="imtcp" MaxSessions="500")
  14. input(type="imtcp" port="514")​
  15. $template linefmt,"%msg:2:$%\n"  #接收日志的格式(去掉开头的空格)​
  16. $template pgloglocation,"/data/pglogs/%hostname%/%$YEAR%-%$MONTH%-%$DAY%.csv"​
  17. :rawmsg,contains,"pg_5432" ?pgloglocation;linefmt
  18. ##变量:%fromhost-ip%
复制代码
三、rsyslog客户端配置

新建配置文件/etc/rsyslog.d/10-pg.conf,并重启rsyslog服务。
  1. cat /etc/rsyslog.d/10-pg.conf​
  2. module(load="imuxsock")
  3. module(load="imklog")
  4. module(load="imfile")​
  5. #module(load="imudp")
  6. #input(type="imudp" port="514")​
  7. module(load="imtcp" MaxSessions="500")
  8. input(type="imtcp" port="514")​
  9. ruleset(name="remote"){
  10.     action(type="omfwd"
  11.             target="x.x.x.x"  #日志服务器IP地址
  12.             port="514"     #端口
  13.             protocol="tcp"   #使用协议
  14.             queue.type="linkedList" #使用异步处理
  15.             queue.spoolDirectory="/var/log/rsyslog" #队列目录
  16.             queue.fileName="pglog"         #队列名称
  17.             queue.maxDiskSpace="1g"         #队列占最大磁盘空间
  18.             queue.saveOnShutdown="on"  #保存内存数据如果rsyslog关闭
  19.             action.resumeRetryCount="-1" #无限重试插入失败
  20.        )
  21.     stop
  22. }​
  23. input(
  24. type="imfile"
  25. File="/pg/data/log/*.csv" #PG服务器日志路径
  26. Facility="local1"
  27. Severity="info"
  28. Tag="pg_5432"       #定义日志标签,重要,服务端根据这个标签可以识别日志
  29. PersistStateInterval="1"  #回写偏移量数据到文件间隔时间(秒),根据实际情况而定
  30. deleteStateOnFileDelete="on"
  31. reopenOnTruncate="on"
  32. Ruleset="remote"      #rsyslog.conf中定义的rule名称
  33. )
复制代码
四、logstash配置

在日志服务器上编辑好配置文件后,启动logstash即可。配置文件如下:
  1. input {
  2. file {
  3.   path => ["/data/pglogs/*/*.csv"]
  4.   start_position => "end"
  5.   codec => multiline {
  6.    pattern => "^20[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}"
  7.    negate => true
  8.    what => "previous"
  9.   }
  10. }
  11. }
  12. filter {
  13. csv {
  14.   separator => ","
  15.   columns => ["log_time","user_name","database_name","process_id","connection_from","session_id","session_line_num","command_tag","session_start_time","virtual_transaction_id","transaction_id","error_severity","sql_state_code","message","detail","hint","internal_query","internal_query_pos","context","query","query_pos","location","application_name"]
  16.   convert => {
  17.    "process_id" => "integer"
  18.    "session_line_num" => "integer"
  19.    "transaction_id" => "integer"
  20.    "internal_query_pos" => "integer"
  21.    "query_pos" => "integer"
  22.   }
  23.   skip_empty_columns => true
  24. }
  25. mutate{
  26.    split => { "log_time" => " CST" }
  27.    add_field => { "log_time_tmp" => "%{[log_time][0]}" }
  28.    remove_field => ["log_time"]
  29. }
  30. date {
  31.    match => ["log_time_tmp", "yyyy-MM-dd HH:mm:ss.SSS"]
  32.    target => "@timestamp"
  33.    locale => "cn"
  34.    remove_field => ["log_time_tmp"]
  35. }
  36. if "duration:" in [message] and "ms" in [message] and "statement:" in [message] {
  37.   grok{
  38.    match => { "message" => "duration: %{NUMBER:duration} ms" }
  39.   }
  40.   mutate{
  41.    split => { "message" => "statement: " }
  42.    add_field => { "statement" => "%{[message][1]}" }
  43.    remove_field => ["message"]
  44.   }
  45. }
  46. mutate{
  47.   split => { "path" => "/" }
  48.   add_field => { "db_host" => "%{[path][3]}" }
  49.   remove_field => ["path", "host"]
  50.   convert => { "duration" => "float" }
  51. }
  52. }​
  53. output {
  54. if [error_severity] == "ERROR" or [error_severity] == "FATAL" or [error_severity] == "PANIC" {
  55.   elasticsearch {
  56.    hosts => ["x.x.x.x:x", "x.x.x.x:x"]
  57.    index => "pg_error"
  58.    id => "elasticsearch_pg_error"
  59.   }
  60. }else if [duration] and [statement] {
  61.   elasticsearch {
  62.    hosts => ["x.x.x.x:x", "x.x.x.x:x"]
  63.    index => "pg_slow"
  64.    id => "elasticsearch_pg_slow"
  65.   }
  66. }
  67. }
复制代码
五、此处省略了Elasticsearch存储与Kibana展示,这里不多介绍
增补:PostgreSQL开发者模式错误反馈与日志设置
####when何时纪录
  1. #client_min_messages = notice
  2. log_min_messages = debug5 #debug级别是提供给开发人员使用的,这个可以看到程序调用的信息以及SQL转化为数据结构的信息,每分钟的级别
复制代码
####where纪录到哪里
  1. #log_destination = 'stderr'
  2. logging_collector = on  #打开日志收集
  3. log_directory = 'pg_log' #日志目录
  4. log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'  
复制代码
####what写什么日志
  1. debug_print_parse = on #解析树
  2. debug_print_rewritten = on #查询重写后的SQL
  3. debug_print_plan = on  #执行计划详细
  4. debug_pretty_print = on #对debug_print_parse,debug_print_rewritten,debug_print_plan可读性格式化
  5. #log_checkpoints = off #如果是研究pg的磁盘IO,这个需要设置为on
  6. log_connections = on #连接日志
  7. log_disconnection = on #断开连接日志
  8. #log_duration=on #语句执行时间,对于分析
复制代码
以上为个人履历,盼望能给各人一个参考,也盼望各人多多支持脚本之家。如有错误或未考虑完全的地方,望不吝见教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作