一个项目必须实现ES自身收到的SQL SELECT 命令的日志记录功能。
搜索网络,发现都是研究如何用ES结合python收集、分析其它数据库或者软件的日志。ES自身的日志如何控制反而说得特别少。
正常情况下,ES6.3 以上都可以支持SQL查询的。具体参见https://zhuanlan.zhihu.com/p/667510163《像mysql一样查询ES,一看就会,爽歪歪》,但是默认配置并不输出这些SQL命令日志。
进一步研究,弄明白ES日志内容主要靠 log4j2.properties配置来控制。
最重要是rootLogger.level = INFO 这一句,需要INFO改成DEBUG
问题是一旦这样修改,就导致日志量大的极其可怕,大到什么程度呢 ?我的笔记本虚拟机里面的单机ES,啥也不干,刚启动就是好几十M。执行一个SQL,日志上涨几千行。必须进行过滤。但是这个配置文件过滤的语法难住我了。很多网上文章都是不对路的,甚至错误的。
其实他支持 json、yaml、xml、peroperties四种模式,对于ES只有最后一种可以用的。百度的AI经常输出错误语法,误导我很多。总之填坑无数个,最后弄清楚
需要这样写:
1 rootLogger.level = DEBUG
2 es7.1 一共两组RollFile日志,一老一新。新的rolling这样修改:
appender.rolling.filter.threshold.type = RegexFilter
appender.rolling.filter.threshold.regex = .((?i)SELECT)\s.
appender.rolling.filter.threshold.onMatch = ACCEPT
appender.rolling.filter.threshold.onMismatch = DENY
.*((?i)SELECT)\s.*是一个正则表达式,对于输入的全部DEBUG级别以上的海量日志,只保留含有SELECT 大小写忽略的日志。
3 老的rolling_old这样修改:
appender.rolling_old.filter.threshold.type = ThresholdFilter
appender.rolling_old.filter.threshold.level = INFO
appender.rolling_old.filter.threshold.onMatch = ACCEPT
appender.rolling_old.filter.threshold.onMismatch = DENY
虽然输入的是DEBUG级别以上的海量日志,但只保留INFO以上的日志,这样xx(es名).log 这个文件还保留原貌,不会爆炸你的硬盘。