複数行にまたがるログを１つのログとして取り込んでみた

New RelicのInfrastructureエージェントはログファイルを指定することでログをNew Relicに送ることができますが、**特定のログに関しては複数行のログを１つのログとしてまとめて送付することができる**ようになったので試してみたいと思います。

Infrastructureエージェントを使ったログ送付はこちらを参照ください。

https://docs.newrelic.com/docs/logs/forward-logs/forward-your-logs-using-infrastructure-agent/

また、**複数行のログを一つにすることができる対象**は下記を参照ください。

https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#built-in-multiline-parsers

:::note info
最新のアップデートの詳細はこちら
- [New Relic アップデート(2024年6月)
](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202406 "New Relic アップデート(2024年6月)")
- [New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

# 概要

EC2上で複数行のログを出力するPythonプログラムを動かして、InfrastructureエージェントでPythonプログラムが出力したログをNew Relicに送付します。

# :one: EC2にInfrastructureエージェントをインストール

まず、EC2（Amazon Linux 2023）を立ち上げて、New RelicのInfrastructureエージェントをインストールします。
詳細は下記を参照ください。

https://qiita.com/nr-mito/items/b11c4645cfc3f5ad6d8a


# :two: 複数行のログを出力するPythonプログラム

[ZeroDivisionError](https://docs.python.org/ja/3.13/library/exceptions.html)を発生させるPythonプログラムを用意して、/home/ec2-user/example/ に配置します。

```python:multilinelog.py
import logging

logging.basicConfig(
    level=logging.DEBUG,
    handlers=[
        logging.StreamHandler(),
        logging.FileHandler('example.log') 
    ]
)

def generate_multiline_log():
    try:
        1 / 0
    except ZeroDivisionError as e:
        logging.error("An error occurred:\n%s", e, exc_info=True) 

if __name__ == "__main__":
    generate_multiline_log()

```

実行すると同じディレクトリのexample.logにログが出力されます。

```shell
$ python3 multilinelog.py 
ERROR:root:An error occurred:
division by zero
Traceback (most recent call last):
  File "/home/ec2-user/example/multilinelog.py", line 13, in generate_multiline_log
    1 / 0
ZeroDivisionError: division by zero
```


# :three: Pythonプログラムのログを送付する設定

/etc/newrelic-infra/logging.d の配下に python-log.yml を作成します。

```yaml:python-log.yml
logs:
  - name: python.log
    file: /home/ec2-user/example/example.log
    attributes:
      logtype: python_logs
```

この状態でPythonプログラムを実行すると、Tracebackが4つログとして別々にNew Relic上に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/e18c6fcd-8e54-491a-a0bd-c01012c01138.png)


# :four: 複数行ログを1つのログとして送付する

複数行のログを1つのログとして送付するためには **multilineParser: python** を追加します。

https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing#built-in-multiline-parsers


```yaml:python-log.yml
logs:
  - name: python.log
    file: /home/ec2-user/example/example.log
    multilineParser: python
    attributes:
      logtype: python_logs
```

この状態でPythonプログラムを実行すると、Tracebackが1つのログとしてNew Relic上に表示されました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/b95c6498-0ce2-43a8-b8df-c3b588f141a8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227243/7dfb1a9a-ed73-4379-ab85-29b44055e449.png)


# その他
New Relicでは、**新しい機能やその活用方法**について、QiitaやXで発信しています！
**無料でアカウント作成**も可能なのでぜひお試しください！

:::note info
New Relic株式会社の[X(旧Twitter)](https://x.com/NewRelicJapan) や [Qiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::