log管理
==========

log进程
----------

1. 进程信息

   -  板端log进程运行信息：

      .. code:: bash

         root@hobot:~# ps -ef | grep log | grep -v -e grep -e login -e dbus-daemon
         root        1010       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log
         root        1152       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-bl31-log-timesync.sh
         root        1564       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start bl31
         root        1565    1564  0 17:17 ?        00:00:00 hrut_remoteproc_log -b /dev/bl31_log_dev -f /log/bl31/message -r 2048 -n 200
         root        1566       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start bpu
         root        1567    1566  0 17:17 ?        00:00:00 hrut_remoteproc_log -b /proc/bpu0_msg -f /log/bpu/message -r 2048 -n 200
         root        1568       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start dsp0
         root        1569    1568  0 17:17 ?        00:00:00 hrut_remoteproc_log -b /sys/class/remoteproc/remoteproc1/log -f /log/dsp0/message -r 2048 -n 200
         root        1570       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-init-hb_hsm_log_server.sh
         root        1573    1570  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start hsm
         root        1574    1573  0 17:17 ?        00:00:00 hsm_log -f /log/hsm/message -r 2048 -n 200
         root        1575       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start logcat
         root        1576    1575  0 17:17 ?        00:00:00 logcat -v time -f /log/usr/message -r2048 -n 200
         root        1577       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start mcu
         root        1578    1577  0 17:17 ?        00:00:00 hrut_remoteproc_log -b /sys/class/remoteproc/remoteproc0/log -f /log/mcu/message -r 2048 -n 200
         root        1579       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start syslogd
         root        1580    1579  0 17:17 ?        00:00:00 syslogd -n -O /log/kernel/message -s 2048 -b 200
         root        1581       1  0 17:17 ?        00:00:00 /bin/bash /usr/bin/hobot-log-start klogd
         root        1614    1581  0 17:17 ?        00:00:00 klogd -n

   -  kernel： klogd+syslogd

      -  获取内核记录的消息，将消息数据转存成文件

   -  usr： ALOG(libalog.so)+logcat

      -  通过ALOG接口pr_*向log buffer写入log信息，logcat从log buffer中获取log信息，将其写入文件中

   -  remoteproc_log：hrut_remoteproc_log和hsm_log进程

      -  通过remoteproc节点获取MCU，DSP，BL31，BPU，HSM的log信息，将其写入文件中

   -  日志管理：hobot-log

      -  log记录：记录reset，pstore，uboot的log信息

      -  log管理：定期每10分钟将原始log文件转存成固定格式文件，管控各个分区目录的存储空间，
         超过固定容量会进行删除，删除时间比较早产生的文件

2. 启动顺序

   -  hobot-log-daemon.service服务开机自启，启动hobot-log守护进程，去启动相关log服务，并管理日志，启动顺序如下：

      .. code:: bash

         |- /usr/bin/hobot-log
               |- wait_for_timesync(shell function)
               |- record_reset_reason(shell function)
               |- record_reset_count(shell function)
               |- set_pstore(shell function)
               |- set_uboot(shell function)
               |- check_first_log(shell function)
               |- 启动相关log进程，/usr/bin/hobot-log-start
                     |- hrut_remoteproc_log -b /dev/bl31_log_dev -f /log/bl31/message -r 2048 -n 200
                     |- hrut_remoteproc_log -b /sys/class/remoteproc/remoteproc1/log -f /log/dsp0/message -r 2048 -n 200
                     |- hrut_remoteproc_log -b /proc/bpu0_msg -f /log/bpu/message -r 2048 -n 200
                     |- hrut_remoteproc_log -b /sys/class/remoteproc/remoteproc0/log -f /log/mcu/message -r 2048 -n 200
                     |- logcat -v time -f /log/usr/message -r2048 -n 200
                     |- syslogd -n -O /log/kernel/message -s 2048 -b 200
                     |- klogd -n
                     |- hsm_log -f /log/hsm/message -r 2048 -n 200
               |- check_log(shell function，major cycle)


log管理方式
--------------

log的文件生成和目录空间管控主要是由hobot-log脚本去管理的。

1. hobot-log

   -  log生成:

      -  系统每次启动时去转存log，log文件命名格式如下：

         -  J6X_Uboot-count-time.Log：当系统启动时，将uboot log转存到uboot的archive目录下
         
         -  J6X_Pstore-count-time（文件夹）：当系统启动时，如果检测到上次系统是异常重启，则创建该格式文件夹，并将对应的异常log信息记录到该文件夹下

      -  系统运行过程中每10分钟去转存log，文件转存到各个模块的archive目录下，log文件命名格式如下：

         -  J6X_Kernel-count-time_<inode>.Log

         -  J6X_Usr-count-time_<inode>.Log

         -  J6X_Bl31-count-time_<inode>.Log

         -  J6X_Dsp0-count-time_<inode>.Log

         -  J6X_Bpu-count-time_<inode>.Log

         -  J6X_Mcu-count-time_<inode>.Log

         -  J6X_Hsm-count-time_<inode>.Log

      -  log文件命名格式解析示例： J6X_Kernel-0003-2022_05_01_08_01_00_131599.Log

         -  命名说明： [board]_[module]-[count]-[time]_<inode>.Log

            -  board: J6X

            -  module: Kernel，Usr，Uboot，Pstore等首字母大写

            -  count: 4位数字，0000到9999，示例中代表第3次重启

            -  time：如2022_05_01_08_01_00

            -  inode：如131599，但正常情况下没有，只有当出现同一时间转存多个文件命名存在重合时，加入inode节点来做区分

   -  容量管控：

      -  一开始划分不同的log目录空间容量，每10分钟针对指定的目录容量去检索空间，如果容量超过，将会按照文件生成时间排序，删除产生时间比较早的文件

      -  hobot-log

         管理着usr、kernel、remoteproc_log、pstore、uboot的空间，对应的数量限制由内部参数设定

         其中，每个类型日志文件大小说明见: :ref:`log分区 <log_partition>` ，usr、kernel、remoteproc_log日志文件系统默认的数量限制为200个，pstore、uboot日志文件系统默认的数量限制为100个

      -  remoteproc_log:

         log的大小是由进程自身管理的，对应的参数配置是hobot-log中去设置的

2. 用户定制log系统

   -  log大小和数量修改

      -  日志大小在hobot-log中修改，修改ROTATESIZE变量的定义，单位是KB，当前值是2048

      -  日志数量在hobot-log中修改，修改ROTATEGENS_KER、ROTATEGENS_USR、ROTATEGENS_REMOTE、UBOOT_LOGMAX、PSTORE_LOGMAX变量的定义，
         对应的分别是kernel、usr、remoteproc_log、uboot、pstore的日志数量限制，当前值分别是200、200、200、100、100

   -  log命名修改

      -  在hobot-log中修改，具体的修改功能逻辑是check_log函数实现的：

         -  $1：log产生的原始目录

         -  $2：log转存的目录

         -  $3：log文件命名的前缀

         -  $4：log文件命名的后缀

         -  $5：log文件的最大数量

            .. code:: bash

               #$1 origin log dir
               #$2 save log dir
               #$3 filename prefix
               #$4 filename suffix
               #$5 maximum log count
               function check_log()
               {
                  local origin_dir="$1"
                  local save_dir="$2"
                  local prefix="$3"
                  local suffix="$4"
                  local log_cnt_max="$5"

      -  具体使用范例

         可以使用check_log第3,4,5个参数来去定义log的文件命名格式以及限制log的文件数量，比如内核和usr日志：

            .. code:: bash

               check_log ${KER_ORI_LOG_DIR}   ${KER_SAVE_LOG_DIR}   "${SOC}_Kernel-${RESET_COUNT}-" ".Log" ${ROTATEGENS_KER}
               check_log ${USR_ORI_LOG_DIR}   ${USR_SAVE_LOG_DIR}   "${SOC}_Usr-${RESET_COUNT}-"    ".Log" ${ROTATEGENS_USR}

   -  log进程的裁剪

      -  可以通过增减systemd的log service，来增减log进程。除了hobot-log-daemon.service服务，其他服务都是通过
         /usr/bin/hobot-log-start脚本启动相关进程。目前log相关服务如下：

         .. code:: bash

            /etc/systemd/system/basic.target.wants/hobot-log-bl31.service
            /etc/systemd/system/basic.target.wants/hobot-log-daemon.service
            /etc/systemd/system/basic.target.wants/hobot-log-bpu.service
            /etc/systemd/system/basic.target.wants/hobot-log-hsm.service
            /etc/systemd/system/basic.target.wants/hobot-log-syslogd.service
            /etc/systemd/system/basic.target.wants/hobot-log-dsp0.service
            /etc/systemd/system/basic.target.wants/hobot-log-klogd.service
            /etc/systemd/system/basic.target.wants/hobot-log-mcu.service
            /etc/systemd/system/basic.target.wants/hobot-log-logcat.service

      -  以hobot-log-logcat.service为例，介绍如何控制log服务启停：

         .. code:: bash

            # 开启服务开机自启
            systemctl enable hobot-log-logcat.service
            # 关闭服务开机自启
            systemctl disable hobot-log-logcat.service
            # 查看服务状态
            systemctl status hobot-log-logcat.service
            # 启动服务
            systemctl start hobot-log-logcat.service
            # 停止服务
            systemctl stop hobot-log-logcat.service
