{"id":3544,"date":"2021-09-29T13:23:29","date_gmt":"2021-09-29T04:23:29","guid":{"rendered":"https:\/\/julialang.kr\/?p=3544"},"modified":"2021-09-29T15:32:52","modified_gmt":"2021-09-29T06:32:52","slug":"julia-logging-logging","status":"publish","type":"post","link":"https:\/\/julialang.kr\/?p=3544","title":{"rendered":"[Julia, Logging] Logging"},"content":{"rendered":"\n<p>Julia\uc5d0\uc11c log\ub97c \uae30\ub85d\ud558\uae30 \uc704\ud574 <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/invenia\/Memento.jl\" target=\"_blank\">Memento<\/a> package\ub97c \uc124\uce58\ud558\uace0 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ud3b8\ub9ac\ud558\uace0 \uc88b\ub2e4<\/p>\n\n\n\n<p>Memento\uac00 \uc9c0\uc6d0\ud558\ub294 log level \ubc0f format\uc740 <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/invenia\/Memento.jl\/blob\/master\/docs\/src\/man\/intro.md\" target=\"_blank\">\uc5ec\uae30<\/a>\ub97c \ucc38\uc870 \ud558\uc138\uc694<\/p>\n\n\n\n<p>Memento\ub97c \uc0ac\uc6a9\ud55c \uac04\ub2e8\ud55c SimpleLogging package\ub97c \ub9cc\ub4e6<\/p>\n\n\n\n<p><a href=\"https:\/\/julialang.kr\/wp-content\/uploads\/2021\/09\/SimpleLogging_202109.zip\" target=\"_blank\" rel=\"noreferrer noopener\">SimpleLogging package download<\/a><\/p>\n\n\n\n<p>SimpleLogging\uc744 \uc0ac\uc6a9\ud55c log \ucc98\ub9ac \uc608\ub294 \uc544\ub798\ub97c \ucc38\uace0.<\/p>\n\n\n\n<p>\uc6d0\ud558\ub294 \ub85c\uae45 \ud3ec\ub9f7\uc740 \uc544\ub798 \uadf8\ub9bc\uacfc \uac19\uc774  \uc2dc\uac04,\ub85c\uadf8\ub808\ubca8,\ub85c\uadf8\ubc1c\uc0dd\ud30c\uc77c \ubc0f \ub77c\uc778, \ub85c\uadf8\uba54\uc2dc\uc9c0<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"136\" src=\"https:\/\/julialang.kr\/wp-content\/uploads\/2021\/09\/image-12.png\" alt=\"\" class=\"wp-image-3545\" srcset=\"https:\/\/julialang.kr\/wp-content\/uploads\/2021\/09\/image-12.png 504w, https:\/\/julialang.kr\/wp-content\/uploads\/2021\/09\/image-12-300x81.png 300w\" sizes=\"(max-width: 504px) 100vw, 504px\" \/><\/figure>\n\n\n\n<p>\ub85c\uadf8\ucc98\ub9ac \ubaa8\ub4c8 \uc608) logging.jl<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>moudle SimpleLogging\n\nimport Memento\nimport Dates\n\n# init_logger\ub97c \ud638\ucd9c\ud788\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \uae30\ubcf8 logger\n_logger = Memento.getlogger(\"my_logger\")\n\n\"\"\"\n  init_logger(;logger::String=\"\",\n                      level=\"debug\",\n                      filename::String=\"log.log\",\n                      filename_prefix::String=\"\",\n                      fmt::String=\"\")\n\n\ub85c\uadf8\ub97c \ub0a8\uae30\uae30 \uc804\uc5d0 \ucd08\uae30\ud654 function\n\nUsage)\ninit_logger()\n@log_debug(\"debug~~~~\")\n\n&#91;output]\n&#91;2021-09-29 02:18:38|debug\t]:(log_test.jl,  45) debug~~~~\n\n\n# Arguments\n- `logger::String`: logger\uba85\uce6d, \uc5c6\uc73c\uba74 default\ub85c \uc124\uc815\n- `level::String`: logging\ub808\ubca8 \n   (ie: `info`, `warn`, `debug`, `trace`, `notice`, `error`, `critical`, `alert`, `emergency`)\n- `filename::String`: log\ub97c \uc800\uc7a5\ud560 \ud30c\uc77c\uba85\n- `filename_prefix::String`: filename\uc55e\uc5d0 \ubd99\ub294 predfx, {filename_prefix}_{filename}\n   \ube48\uac12\uc778 \uacbd\uc6b0 yyyymmdd\ud615\uc2dd\uc758 \uc624\ub298\uc77c\uc790 \uc2a4\ud2b8\ub9c1\uc774 \uc0dd\uc131\ub418\uc5b4 \ud30c\uc77c\uba85\uc5d0 \ubd99\ub294\ub2e4\n   (ie: 20210928_log.log)\n- `fmt::String`: log \ucd9c\ub825 \ud615\uc2dd, \uc544\ub798 URL \ucc38\uc870\n   https:&#47;&#47;github.com\/invenia\/Memento.jl\/blob\/master\/docs\/src\/man\/intro.md\n\n\"\"\"\nfunction init_logger(;logger::String=\"\",\n                    level::String=\"debug\",\n                    filename::String=\"log.log\",\n                    filename_prefix::String=\"\",\n                    fmt::String=\"\")\n    \n    global _logger    \n    \n    fmt_elms = &#91;\"{date}\",\"{level}\\t\"]    \n    if logger != \"\"\n      push!(fmt_elms,\"{name}\")\n    end\n    if fmt == \"\"\n      fmt =  string(\"&#91;\",join(fmt_elms,\"|\"),\"]:{msg}\")\n    end \n    # log lebvel\uc774 \uc8fc\uc5b4\uc9c4 level\uc5d0 \uc5c6\ub294 \uacbd\uc6b0 debug\ub85c \uc124\uc815\n    if !(level in (\"info\", \"warn\", \"debug\", \"trace\", \"notice\", \"error\", \"critical\", \"alert\", \"emergency\"))\n      level = \"debug\"\n    end\n    # \uae30\uc874\uc5d0 \uc124\uc815\ub41c logger \ucd08\uae30\ud654\n    Memento.reset!()\n    if logger == \"\"\n        _logger  = Memento.config!(level;fmt=fmt)\n    else\n        _logger  = Memento.config!(\"my_logger\",level;fmt=fmt)\n    end\n    # log file\uc774 \uc9c0\uc815\ub41c \uacbd\uc6b0 \ud30c\uc77c\uc5d0 log\ub97c \uae30\ub85d \ud560 \uc218 \uc788\ub3c4\ub85d \uc131\uc815\n    if length(filename) != \"\"\n      if filename_prefix == \"\"\n        filename_prefix = Dates.format(Dates.now(),\"yyyymmdd\")\n        filename = joinpath(dirname(filename),string(filename_prefix ,\"_\",basename(filename)))\n      end        \n      handler = Memento.DefaultHandler(\n          filename,\n          Memento.DefaultFormatter(fmt) )\n      push!(_logger, handler)\n    end\n    nothing\nend\n\nfunction set_level(level::String)\n  Memento.setlevel!(_logger,level)\n  nothing\nend\n\n\"\ub85c\uadf8 \ubc1c\uc0dd \uc18c\uc2a4 \ud30c\uc77c\uacfc \ub77c\uc778\ubc88\ud638\ub97c \ub0a8\uae30 \uc704\ud574 \uc544\ub798\uc640 \uac19\uc774 \ucc98\ub9ac\"\nfunction _log(_file,_line,msg,f::Function)\n    s = string(\"(\",basename(_file),\",\",lpad(_line,4,\" \"),\") \",msg)\n    f(_logger,s)\nend\n\n\"info log\"\nmacro log_info(msg)  \n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.info)\n  end \nend\n\n\"warning log\"\nmacro log_warn(msg)  \n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.warn)\n  end\nend\n\n\"debug log\"\nmacro log_debug(msg)\n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.debug)\n  end  \nend\n\n\"tracer log\"\nmacro log_trace(msg)  \n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.trace)\n  end \nend\n\n\"notice log\"\nmacro log_notice(msg)  \n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.notice)\n  end \nend\n\n\"error log\ub97c \ucd9c\ub825\ud558\uace0 exception \ubc1c\uc0dd, try-catch\ub85c \ucc98\ub9ac \ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\"\nmacro log_error(msg)\n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.error)\n  end \nend\n\n\"error log, try-catch\ub85c \ucc98\ub9ac \ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\"\nmacro log_critical(msg)  \n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.critical)\n  end\nend\n\n\"\uc804\uccb4 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uc2ec\uac01\ud55c \uc5d0\ub7ec\ub85c \ubcf5\uad6c\ud560 \uc218 \uc5c6\ub294 \uacbd\uc6b0\ub85c \uc2dc\uc2a4\ud15c\uad00\ub9ac\uc790\ub97c \ubd88\ub7ec\uc57c \ud558\ub294 \uacbd\uc6b0, try-catch \ud544\uc694\"\nmacro log_alert(msg)\n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.alert)\n  end \nend\n\n\"\uc2dc\uc2a4\ud15c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub294 \uacbd\uc6b0,try-catch \ud544\uc694\"\nmacro log_emergency(msg)\n  quote\n    _log($(string(__source__.file)),$(string(__source__.line)),$(esc(msg)),Memento.emergency)\n  end\nend\n\nend<\/code><\/pre>\n\n\n\n<p>\ub85c\uadf8\ucc98\ub9ac \ubaa8\ub4c8 \uc0ac\uc6a9<br>\uc608) log_test.jl<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \"MyLogging\" module\uc774 \uc788\ub294 path\ub97c LOAD_PATH \ud658\uacbd\ubcc0\uc218\uc5d0 \ucd94\uac00\nmy_module_path = \"\/dev\/logging\"\nif  !(my_module_path \u2208 LOAD_PATH)\n  push!(LOAD_PATH, my_module_path)\nend\n\nusing SimpleLogging\n\ninit_logger()\n\nprintln(\"========debug mode=========\")\n@log_info(\"info~~~~\")\n@log_warn(\"warn~~~~\")\n@log_debug(\"debug~~~~\")\n@log_trace(\"trace~~~~\")\n@log_notice(\"notice~~~~\")\n\nprintln(\"========info mode=========\")\nset_level(\"info\")\n@log_info(\"info~~~~\")\n@log_warn(\"warn~~~~\")\n@log_debug(\"debug~~~~\")\n@log_trace(\"trace~~~~\")\n@log_notice(\"notice~~~~\")\n\nprintln(\"========warn mode=========\")\nset_level(\"warn\")\n@log_info(\"info~~~~\")\n@log_warn(\"warn~~~~\")\n@log_debug(\"debug~~~~\")\n@log_trace(\"trace~~~~\")\n@log_notice(\"notice~~~~\")\n\nprintln(\"========notice mode=========\")\nset_level(\"notice\")\n@log_info(\"info~~~~\")\n@log_warn(\"warn~~~~\")\n@log_debug(\"debug~~~~\")\n@log_trace(\"trace~~~~\")\n@log_notice(\"notice~~~~\")\n\nprintln(\"========trace mode=========\")\nset_level(\"trace\")\n@log_info(\"info~~~~\")\n@log_warn(\"warn~~~~\")\n@log_debug(\"debug~~~~\")\n@log_trace(\"trace~~~~\")\n@log_notice(\"notice~~~~\")\n# try \uc5c6\uc774\ub294 \uc2e4\ud589 \ud6c4 \uc885\ub8cc\n# @log_emergency(\"emergency~~~~\")\n# @log_alert(\"alert~~~~\")\nprintln(\"========error mode=========\")\ntry\n  @log_error(\"error~~~~\")\ncatch e\n  @log_warn(string(e))\nend\n\nprintln(\"========critical mode=========\")\ntry\n  @log_critical(\"critical~~~~\")\ncatch e\n  @log_warn(string(e))\nend\n\nprintln(\"========alert mode=========\")\ntry\n  @log_alert(\"alert~~~~\")\ncatch e\n  @log_warn(string(e))\nend\n\nprintln(\"========emergency mode=========\")\ntry\n  @log_emergency(\"emergency~~~~\")\ncatch e\n  @log_warn(string(e))\nend\n\n \nprintln(\"========END!=========\")\n\n<\/code><\/pre>\n\n\n\n<p>\ucd9c\ub825<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>========debug mode=========\n&#91;2021-09-29 13:14:05|info\t]:(log_test.jl,  11) info~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  12) warn~~~~\n&#91;2021-09-29 13:14:06|debug\t]:(log_test.jl,  13) debug~~~~\n&#91;2021-09-29 13:14:06|notice\t]:(log_test.jl,  15) notice~~~~\n========info mode=========\n&#91;2021-09-29 13:14:06|info\t]:(log_test.jl,  19) info~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  20) warn~~~~\n&#91;2021-09-29 13:14:06|notice\t]:(log_test.jl,  23) notice~~~~\n========warn mode=========\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  28) warn~~~~\n========notice mode=========\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  36) warn~~~~\n&#91;2021-09-29 13:14:06|notice\t]:(log_test.jl,  39) notice~~~~\n========trace mode=========\n&#91;2021-09-29 13:14:06|info\t]:(log_test.jl,  43) info~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  44) warn~~~~\n&#91;2021-09-29 13:14:06|debug\t]:(log_test.jl,  45) debug~~~~\n&#91;2021-09-29 13:14:06|trace\t]:(log_test.jl,  46) trace~~~~\n&#91;2021-09-29 13:14:06|notice\t]:(log_test.jl,  47) notice~~~~\n========error mode=========\n&#91;2021-09-29 13:14:06|error\t]:(log_test.jl,  53) error~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  55) ErrorException(\"(log_test.jl,  53) error~~~~\")\n========critical mode=========\n&#91;2021-09-29 13:14:06|critical\t]:(log_test.jl,  60) critical~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  62) ErrorException(\"(log_test.jl,  60) critical~~~~\")\n========alert mode=========\n&#91;2021-09-29 13:14:06|alert\t]:(log_test.jl,  67) alert~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  69) ErrorException(\"(log_test.jl,  67) alert~~~~\")\n========emergency mode=========\n&#91;2021-09-29 13:14:06|emergency\t]:(log_test.jl,  74) emergency~~~~\n&#91;2021-09-29 13:14:06|warn\t]:(log_test.jl,  76) ErrorException(\"(log_test.jl,  74) emergency~~~~\")\n========END!=========<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Julia\uc5d0\uc11c log\ub97c \uae30\ub85d\ud558\uae30 \uc704\ud574 Memento package\ub97c \uc124\uce58\ud558\uace0 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \ud3b8\ub9ac\ud558\uace0 \uc88b\ub2e4 Memento\uac00 \uc9c0\uc6d0\ud558\ub294 log level \ubc0f format\uc740 \uc5ec\uae30\ub97c \ucc38\uc870 \ud558\uc138\uc694 Memento\ub97c \uc0ac\uc6a9\ud55c \uac04\ub2e8\ud55c SimpleLogging package\ub97c \ub9cc\ub4e6 SimpleLogging package download SimpleLogging\uc744 \uc0ac\uc6a9\ud55c log \ucc98\ub9ac \uc608\ub294 \uc544\ub798\ub97c \ucc38\uace0. \uc6d0\ud558\ub294 \ub85c\uae45 \ud3ec\ub9f7\uc740 \uc544\ub798 \uadf8\ub9bc\uacfc \uac19\uc774 \uc2dc\uac04,\ub85c\uadf8\ub808\ubca8,\ub85c\uadf8\ubc1c\uc0dd\ud30c\uc77c \ubc0f \ub77c\uc778, \ub85c\uadf8\uba54\uc2dc\uc9c0 \ub85c\uadf8\ucc98\ub9ac \ubaa8\ub4c8 \uc608) logging.jl \ub85c\uadf8\ucc98\ub9ac \ubaa8\ub4c8 \uc0ac\uc6a9\uc608) log_test.jl \ucd9c\ub825<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[24],"tags":[],"_links":{"self":[{"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/posts\/3544"}],"collection":[{"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/julialang.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3544"}],"version-history":[{"count":8,"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/posts\/3544\/revisions"}],"predecessor-version":[{"id":3570,"href":"https:\/\/julialang.kr\/index.php?rest_route=\/wp\/v2\/posts\/3544\/revisions\/3570"}],"wp:attachment":[{"href":"https:\/\/julialang.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/julialang.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/julialang.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}