提取多行正则表达式并在需要时解析新行
Extract mulitline regexp and parse newlines when needed
我正在尝试从包含重音字符的特定多行日志中提取 2 行(多次)(我无法更改日志)。
(原始日志文件可供参考,但我想显示来自 ansible playbook 日志的 pb 摘要)。
我尝试解析的日志如下所示:
_
2021 年 2 月 11 日 17:14:20;...
2021 年 2 月 11 日 17:14:20;==================================
02/11/2021 17:14:20;开始测试:OUTBOUND RabbitMQ
02/11/2021 17:14:51;验证代理属性时出错:OUTBOUND RabbitMQ
java.lang.Exception: ERREUR::Exception lors de l'ouverture du channel[连接超时:连接]
在 com.mom.utils.ClientUtils.openChannel(ClientUtils.java:80) ~[classes/:na]
在 com.mom.properties.RabbitMqOutboundProperties.testConfig(RabbitMqOutboundProperties.java:61) ~[classes/:na]
在 com.mom.BrokerConfigurationTester.main(BrokerConfigurationTester.java:73) ~[classes/:na]
2021 年 2 月 11 日 17:14:51;======================================= ===
2021 年 2 月 11 日 17:14:51;...
_
为此,我有一个看起来像这样的 ansible 任务:
- name: showing Errors and Exception
debug:
msg: "{{ item }}"
with_items:
- "{{ test_result.stdout_lines| string | regex_findall ('(Error validating properties for broker :)[a-zA-Z0-9 '']*$.^((?!Exception).)*Exception:[^\n]*',multiline=True) }}"
# one test among many
不幸的是,在 regexp tester or here 中有效的方法在 Ansible regexp_findall 过滤器中无效。
我的主要 pb 是我(认为我)需要“multiline=true”才能连续捕获 2 行,但后来我无法停止捕获行尾(因为基本上“.*$”不会停在行尾,而是停在文本末尾)。
据我所知,“除换行符外的所有内容”([^\n]*)无法通过可靠的正则表达式(或不是我尝试的方式)运行
我已经尝试了 this post 中的所有解决方案,但它们在 ansible 过滤器中不起作用。
重音字符导致编码错误(不是“UTF8”),字符 class \u00C0 被视为范围(“从 \u 到 0”)
所以基本上,我试图找到如何使用 ansible 执行此操作(可能是底层 python?)
有什么建议吗?
我建议你改用 stdout stdout_lines:
- name: test regex
hosts: localhost
tasks:
- name: trap the log in register
command: cat logs/testfile.log
register: output
- name: Print output
debug:
var: output
- name: build log
set_fact:
log: "{{ output.stdout | regex_findall('([0-9 :/;]+Error validating properties for broker :.+)\n(.+)') }}"
- name: Print log
debug:
msg: "{{ item }}"
loop: "{{ log }}"
结果:
ok: [localhost] => (item=['02/11/2021 17:14:51;Error validating properties for broker : OUTBOUND RabbitMQ', "java.lang.Exception: ERREUR::Exception lors de l'ouverture du channel[Connection timed out: connect]"]) =>
msg:
- '02/11/2021 17:14:51;Error validating properties for broker : OUTBOUND RabbitMQ'
- 'java.lang.Exception: ERREUR::Exception lors de l''ouverture du channel[Connection timed out: connect]'
ok: [localhost] => (item=['02/11/2021 17:14:53;Error validating properties for broker : INBOUND MqSeries', "com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Echec de la connexion au gestionnaire de files d'attente 'QMFINOUT' à l'aide du mode de connexion 'Client' et du nom d'hôte 'Client'."]) =>
msg:
- '02/11/2021 17:14:53;Error validating properties for broker : INBOUND MqSeries'
- 'com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Echec de la connexion au gestionnaire de files d''attente ''QMFINOUT'' à l''aide du mode de connexion ''Client'' et du nom d''hôte ''Client''.'
我正在尝试从包含重音字符的特定多行日志中提取 2 行(多次)(我无法更改日志)。
(原始日志文件可供参考,但我想显示来自 ansible playbook 日志的 pb 摘要)。
我尝试解析的日志如下所示:
_
2021 年 2 月 11 日 17:14:20;...
2021 年 2 月 11 日 17:14:20;==================================
02/11/2021 17:14:20;开始测试:OUTBOUND RabbitMQ
02/11/2021 17:14:51;验证代理属性时出错:OUTBOUND RabbitMQ
java.lang.Exception: ERREUR::Exception lors de l'ouverture du channel[连接超时:连接]
在 com.mom.utils.ClientUtils.openChannel(ClientUtils.java:80) ~[classes/:na]
在 com.mom.properties.RabbitMqOutboundProperties.testConfig(RabbitMqOutboundProperties.java:61) ~[classes/:na]
在 com.mom.BrokerConfigurationTester.main(BrokerConfigurationTester.java:73) ~[classes/:na]
2021 年 2 月 11 日 17:14:51;======================================= ===
2021 年 2 月 11 日 17:14:51;...
_
为此,我有一个看起来像这样的 ansible 任务:
- name: showing Errors and Exception
debug:
msg: "{{ item }}"
with_items:
- "{{ test_result.stdout_lines| string | regex_findall ('(Error validating properties for broker :)[a-zA-Z0-9 '']*$.^((?!Exception).)*Exception:[^\n]*',multiline=True) }}"
# one test among many
不幸的是,在 regexp tester or here 中有效的方法在 Ansible regexp_findall 过滤器中无效。
我的主要 pb 是我(认为我)需要“multiline=true”才能连续捕获 2 行,但后来我无法停止捕获行尾(因为基本上“.*$”不会停在行尾,而是停在文本末尾)。
据我所知,“除换行符外的所有内容”([^\n]*)无法通过可靠的正则表达式(或不是我尝试的方式)运行
我已经尝试了 this post 中的所有解决方案,但它们在 ansible 过滤器中不起作用。
重音字符导致编码错误(不是“UTF8”),字符 class \u00C0 被视为范围(“从 \u 到 0”)
所以基本上,我试图找到如何使用 ansible 执行此操作(可能是底层 python?)
有什么建议吗?
我建议你改用 stdout stdout_lines:
- name: test regex
hosts: localhost
tasks:
- name: trap the log in register
command: cat logs/testfile.log
register: output
- name: Print output
debug:
var: output
- name: build log
set_fact:
log: "{{ output.stdout | regex_findall('([0-9 :/;]+Error validating properties for broker :.+)\n(.+)') }}"
- name: Print log
debug:
msg: "{{ item }}"
loop: "{{ log }}"
结果:
ok: [localhost] => (item=['02/11/2021 17:14:51;Error validating properties for broker : OUTBOUND RabbitMQ', "java.lang.Exception: ERREUR::Exception lors de l'ouverture du channel[Connection timed out: connect]"]) =>
msg:
- '02/11/2021 17:14:51;Error validating properties for broker : OUTBOUND RabbitMQ'
- 'java.lang.Exception: ERREUR::Exception lors de l''ouverture du channel[Connection timed out: connect]'
ok: [localhost] => (item=['02/11/2021 17:14:53;Error validating properties for broker : INBOUND MqSeries', "com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Echec de la connexion au gestionnaire de files d'attente 'QMFINOUT' à l'aide du mode de connexion 'Client' et du nom d'hôte 'Client'."]) =>
msg:
- '02/11/2021 17:14:53;Error validating properties for broker : INBOUND MqSeries'
- 'com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0018: Echec de la connexion au gestionnaire de files d''attente ''QMFINOUT'' à l''aide du mode de connexion ''Client'' et du nom d''hôte ''Client''.'