민서네집

dmesg 로그의 timestamp를 날짜로 변경하는 스크립트 본문

LINUX

dmesg 로그의 timestamp를 날짜로 변경하는 스크립트

브라이언7 2016. 11. 15. 13:48

How to make dmesg timestamp human readable

https://linuxaria.com/article/how-to-make-dmesg-timestamp-human-readable


아래는 python 소스이다.


#!/usr/bin/env python

# coding=utf8

 

# Copyright (C) 2010 Saúl ibarra Corretgé <saghul@gmail.com>

#

 

"""

pydmesg: dmesg with human-readable timestamps

"""

 

from __future__ import with_statement

 

import re

import subprocess

import sys

 

from datetime import datetime, timedelta

 

_datetime_format = "%Y-%m-%d %H:%M:%S"

_dmesg_line_regex = re.compile("^\[(?P<time>\d+\.\d+)\](?P<line>.*)$")

 

def exec_process(cmdline, silent, input=None, **kwargs):

    """Execute a subprocess and returns the returncode, stdout buffer and stderr buffer.

       Optionally prints stdout and stderr while running."""

    try:

        sub = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)

        stdout, stderr = sub.communicate(input=input)

        returncode = sub.returncode

        if not silent:

            sys.stdout.write(stdout)

            sys.stderr.write(stderr)

    except OSError,e:

        if e.errno == 2:

            raise RuntimeError('"%s" is not present on this system' % cmdline[0])

        else:

            raise

    if returncode != 0:

        raise RuntimeError('Got return value %d while executing "%s", stderr output was:\n%s' % (returncode, " ".join(cmdline), stderr.rstrip("\n")))

    return stdout

 

def human_dmesg():

    now = datetime.now()

    uptime_diff = None

    try:

        with open('/proc/uptime') as f:

            uptime_diff = f.read().strip().split()[0]

    except IndexError:

        return

    else:

        try:

            uptime = now - timedelta(seconds=int(uptime_diff.split('.')[0]), microseconds=int(uptime_diff.split('.')[1]))

        except IndexError:

            return

 

    dmesg_data = exec_process(['dmesg'], True)

    for line in dmesg_data.split('\n'):

        if not line:

            continue

        match = _dmesg_line_regex.match(line)

        if match:

            try:

                seconds = int(match.groupdict().get('time', '').split('.')[0])

                nanoseconds = int(match.groupdict().get('time', '').split('.')[1])

                microseconds = int(round(nanoseconds * 0.001))

                line = match.groupdict().get('line', '')

                t = uptime + timedelta(seconds=seconds, microseconds=microseconds)

            except IndexError:

                pass

            else:

                print "[%s]%s" % (t.strftime(_datetime_format), line)

 

if __name__ == '__main__':

    human_dmesg()



Comments