Armadilloフォーラム

/var/messageの日付文字列を「YYYY/MM/DD hh:mm:ss」の形式に変更したい

kn_kobayashi

2023年2月7日 11時54分

お世話になります。
やりたいことは件名の通り、/var/messageの日付文字列を
「YYYY/MM/DD hh:mm:ss」形式に変更したい、ということです。

元々Armadillo-IoTG4に入っているalpineLinuxにはsyslogが入っていると思いますが、
syslogはフォーマットの変更を出来なさそうなので、今rsyslogを入れ替える方法で
検討しています。

そこで質問なのですが、具体的な手順としては以下の様に、
syslogの自動起動を外し、rsyslogをpersistでインストールし、
rsyslogでの文字出力時、所定のフォーマットで出す様に変更しようとしています。
このやり方で大体はいけそうなのですが、ただ一つ分からないのが、
電源ONで起動したとき、やはりsyslogが自動起動してしまうという点です。
rc-status -aすると、「Dynamic Runlevel: needed/wanted」と表示されます。

どのようにして、やりたいことを実現したらよいか、ご教授いただけないでしょうか。
方針から間違っていれば、それを教えて頂けますと助かります。

armadillo:/# rc-update del syslog boot
armadillo:/# persist_file -d /etc/runlevels/boot/syslog
armadillo:/# rm -rf /var/log/messages
armadillo:/# persist_file -a add rsyslog
armadillo:/# rc-update add rsyslog
armadillo:/# persist_file /etc/runlevels/default/rsyslog
armadillo:/# mkdir /etc/rsyslog.d/
armadillo:/# vi /etc/rsyslog.d/template.conf
----------------------------------
$template template, "%timegenerated:::date-year%/%timegenerated:::date-month%/%timegenerated:::date-day% %timegenerated:::date-hour%:%timegenerated:::date-minute%:%timegenerated:::date-second%,%syslogseverity-text% %syslogtag% %msg%\n"
----------------------------------
armadillo:/# vi /etc/rsyslog.conf
----------------------------------
#*.info;authpriv.none;cron.none;kern.none;mail.none -/var/log/messages << コメントアウト
*.info;authpriv.none;cron.none;kern.none;mail.none -/var/log/messages;template << 追加
----------------------------------
armadillo:/# persist_file /etc/rsyslog.d/template.conf /etc/rsyslog.conf

コメント

at_dominique.m…

2023年2月8日 8時12分

kn_kobayashiさん

お世話になっています、
アットマークテクノのマルティネです。

> やりたいことは件名の通り、/var/messageの日付文字列を
> 「YYYY/MM/DD hh:mm:ss」形式に変更したい、ということです。
>
> 元々Armadillo-IoTG4に入っているalpineLinuxにはsyslogが入っていると思いますが、
> syslogはフォーマットの変更を出来なさそうなので、今rsyslogを入れ替える方法で
> 検討しています。

Armadillo Base OS は busybox の syslogd を使って、タイムスタンプのフォーマットのオプションは確かにないですね。
syslog のフォーマットは元々 rfc3164[1] の BSD syslog フォーマットで決められたことで、不便なところがあっても(年もタイムゾーンもない)固まったままにしか使えません。
[1] https://www.rfc-editor.org/rfc/rfc3164

> そこで質問なのですが、具体的な手順としては以下の様に、
> syslogの自動起動を外し、rsyslogをpersistでインストールし、
> rsyslogでの文字出力時、所定のフォーマットで出す様に変更しようとしています。
> このやり方で大体はいけそうなのですが、

そうですね、rsyslog なら設定できますね。
以下の質問を答える前に、いくつかの注意点がございますので、先に説明をさせていただきます。

* persist_file -a でインストールしたパッケージはアップグレードの際に残りませんので、これからのアップデートは弊社が用意している rootfs や swu ファイルを使用できなくなります。
開発ツール[2] の「Alpine Linuxルートファイルシステムビルドツール」を毎回更新して、以下と似たような変更を行って(パッケージリストに rsyslog の追加、コンフィグファイルの追加、サービスの変更)ご自分で作成しないといけなくなります。
お手数で申し訳ございませんが、アップデートの仕組みがパッケージ単位ではなくシステム毎に更新することにしたことでこういう変更はサポートできません。
[2] https://armadillo.atmark-techno.com/resources/software/armadillo-iot-g4…
* busybox の syslogd はログのロテーションも行っています。/var/log/messages が 4MB 以上になりましたら自動的に .1 にリネームされますので、rsyslog で似たような設定か cron+logrotate もインストールする必要があります。rsyslog のサイトによると自動的に出きるらしいですが、試してません: https://www.rsyslog.com/doc/v8-stable/tutorials/log_rotation_fix_size.h…

これからは個人的な意見で出すぎた事かもしれませんが、簡単に更新できなくなる点はかなり大きく感じていますので、回りくどいやり方ですが、https://www.rfc-editor.org/rfc/rfc5424 の 6.2.3 TIMESTAMP を参考にして、busybox に 「1985-04-12T19:20:50.52-04:00」のフォーマットをオプションで追加してみてはいかがでしょうか?
希望していたフォーマットと少し異なりますが、情報が揃っているので使えるかと思います。そうしたら、/etc/conf.d/syslog の変更だけでアップデート可能なシステムになりますので、短時間の努力で長時間の手間を減らせると思います。
まぁ、別の理由で rootfs に変更を加えているのであればそこまでしなくてもいいかと思います。個人的な意見は以上で、失礼しました。

> 電源ONで起動したとき、やはりsyslogが自動起動してしまうという点です。
> rc-status -aすると、「Dynamic Runlevel: needed/wanted」と表示されます。

syslog が needed/wanted になっているので、別のサービスが syslog または logger (/etc/init.d/syslog の 'provide logger' から)に依存して、rsyslog が起動されている前に起動しています。
klogd ですね。 `boot` の runlevel で起動していて `need syslog` で起動させています。その need syslog は need logger に変更するべきですので、そこはバグですが、boot は default より先に実行されていますのでそれだけでも syslog が起動される可能性があります。klogd の起動を遅くして default に変更するか、rsyslog も boot で起動させないといけません。
(とりあえず、依存の問題は alpine に直しておきます: https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/43987 )

klogd の修正もできますが、今回は rsyslog のカーネルメッセージを読むモジュールがありますので、 klogd を無効化して imklog を使った方がいいと思います:
https://www.rsyslog.com/doc/v8-stable/configuration/modules/imklog.html

よろしくお願いします。

at_dominique.m…

2023年2月8日 10時54分

kn_kobayashiさん

連続の返事ですみません。マルティンです。

rootfs がアップデートしにくくなりますので、同僚から別の案をいただきました。

/var/log/message のフォーマットを変更したいと言うより、dmesg (/dev/kmsg) の内容をこのタイムスタンプで保存したいということですね?
それでしたら、Armadillo Base OS をそのままにしてコンテナ内にもう一つの rsyslog を実行したらいかがでしょうか。

本来の設計では Armadillo Base OS のホストの部分の変更を最低限にしてコンテナで対応できる物をすべてコンテナで対応していただく設計ですので、とてもいい案だと思いました。将来 Base OS の syslog や init の部分に変更を加えても迷惑にならずにコンテナの中の syslog に影響しませんので、安心して使えます。

以下の手順でシンプルなバージョンをできました

armadillo:~# abos-ctrl podman-storage --disk
armadillo:~# printf '%s\n' 'FROM alpine:latest' 'RUN apk add rsyslog' | podman build -t syslog -f -
STEP 1/2: FROM alpine:latest
STEP 2/2: RUN apk add rsyslog
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/aarch64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/aarch64/APKINDEX.tar.gz
(1/4) Installing libestr (0.1.11-r2)
(2/4) Installing libfastjson (0.99.9-r0)
(3/4) Installing libuuid (2.38.1-r1)
(4/4) Installing rsyslog (8.2212.0-r0)
Executing busybox-1.35.0-r29.trigger
OK: 10 MiB in 19 packages
COMMIT syslog
--> f122f656861
Successfully tagged localhost/syslog:latest
f122f656861dccd500e2293eb96c5f2f6f26892c9bd03bc3660707c95d4a00fd
armadillo:~# cat > /etc/atmark/containers/syslog.conf <<EOF
set_image syslog
add_volumes /var/app/volumes/log:/var/log
add_volumes rsyslog.conf:/etc/rsyslog.conf
add_device /dev/kmsg
set_command rsyslogd -n
EOF
armadillo:~# persist_file -v /etc/atmark/containers/syslog.conf 
'/etc/atmark/containers/syslog.conf' -> '/mnt/etc/atmark/containers/syslog.conf'
armadillo:~# cat > /var/app/rollback/volumes/rsyslog.conf  <<EOF
$WorkDirectory /var/lib/rsyslog
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
 
module(load="imklog" logpath="/dev/kmsg")
kern.*							/var/log/kern.log
EOF
armadillo:~# podman_start syslog # か再起動
Starting 'syslog'
0b1776cf888e0a27da9249189ef896960a1187eb84625702cac23be211c7c5bb
armadillo:~# tail /var/app/volumes/log/kern.log 
...
2023-02-08T01:51:40.917670+00:00 0b1776cf888e kernel: 6,639,152102540570,-;EXT4-fs (mmcblk2p1): re-mounted. Opts: (null)
(フォーマットとロテーションは直してません)

いかがでしょうか?

よろしくお願いします。