줄리아에서 xterm에 로그 보내기

9751 단어 Julia

의 목적


다중 프로세스의 코드를 디버깅하기 위해서 로그를 각각 다른 곳에 두지 않으면 매우 번거롭다.개별 서류에 적고 다른 창문tail -f으로 닦으면 되지만 매번 하기가 번거롭다.그래서 나는 자동으로 창을 열고 로그를 쓰고 싶다.

메서드


할 일은 매우 간단하다. 로그를 임시 파일에 쓴 다음 xterm 에서 이 파일을 진행한다. tail -fMac 사용자이기 때문에 테미널을 사용할 수 있다면 더 좋겠지만, 제어하는 방법을 몰라서 xterm을 사용합니다.맥에서 xterm을 사용하려면 Xquatz가 필요하지만 brew로 간단하게 들어갈 수 있습니다.

이루어지다

AbstractLogger의 하위 유형을 생성합니다.이때 상속ConsoleLogger.상속은 이 보도에 적힌 MacroTools@forward를 사용했다.
여기에 문제가 하나 있다.ConsoleLogger 쓴 후에 플래시가 없는stream.보통 stderr에서 시작하는데 stderr 자동 플래시 때문에 문제가 없지만 자동 플래시 흐름이 없으면 실시간으로 쓸 수 없기 때문에 곤란합니다.따라서 handle_message 방법만 교차된다.그럼에도 불구하고 ConsoleLoggerhandle_message를 호출한 후에stream이 유행하지 않을 뿐이다.
module XtermLogging
export XtermLogger

import MacroTools
import Logging
import Dates

function timed_metafmt(level, _module, group, id, file, line)
    color, prefix, suffix = 
      Logging.default_metafmt(level, _module, group, id, file, line)
    timestamp = Dates.now()
    prefix2 = "$timestamp : $prefix"
    return color, prefix2, suffix
end

struct XtermLogger <: Base.CoreLogging.AbstractLogger
    sl::Logging.ConsoleLogger
    filename
    proc::Base.Process
end

function XtermLogger(title, level=Logging.Info;
                    display=":0",
                    meta_formatter=timed_metafmt, show_limited=true,
                    right_justify=0)
    tmpfile, stream = Base.Filesystem.mktemp()
    xterm = "/usr/local/bin/xterm"
    proc = open(`$xterm -display $display -title $title -e tail -f $tmpfile`)
    XtermLogger(Logging.ConsoleLogger(stream, level;
                    meta_formatter=meta_formatter, 
                    show_limited=show_limited,
                    right_justify=right_justify),
                tmpfile, proc)
end

@MacroTools.forward XtermLogger.sl Base.CoreLogging.shouldlog, 
                                Base.CoreLogging.min_enabled_level, 
                                Base.CoreLogging.catch_exceptions

function Base.CoreLogging.handle_message(logger::XtermLogger, level, message, _module, group, id,
    filepath, line; maxlog=nothing, kwargs...)
    Base.CoreLogging.handle_message(logger.sl, level, message, _module, group, id, filepath, line; maxlog, kwargs...)
    flush(logger.sl.stream)
end

end
기본 표시 시간timed_metafmt을 사용합니다.이 일대의 상세한 상황은 이 보도에 쓰여 있다.

사용법

XtermLoggingLoggingusing를 통해 가져옵니다.
push!(LOAD_PATH, pwd())
using XtermLogging
using Logging
제작XtermLogger.매개 변수는 창 제목입니다.
xlogger = XtermLogger("test0")
만들어진 Logger는 일반 Logger로 사용할 수 있습니다.
with_logger(xlogger) do 
    @error("test $i")    
end

좋은 웹페이지 즐겨찾기