You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
568tools/lib/tools/rusty-book/devtools/config-log.html

104 lines
17 KiB

<!doctype html><html lang=zh-CN class="sidebar-visible no-js light"><meta charset=UTF-8><title>配置日志 - Rusty Book(锈书)</title><meta content="text/html; charset=utf-8" http-equiv=Content-Type><meta name=description content=""><meta name=viewport content="width=device-width,initial-scale=1"><meta name=theme-color content=#ffffff><link rel=icon href=../favicon.svg><link rel="shortcut icon" href=../favicon.png><link rel=stylesheet href=../css/variables.css><link rel=stylesheet href=../css/general.css><link rel=stylesheet href=../css/chrome.css><link rel=stylesheet href=../css/print.css media=print><link rel=stylesheet href=../FontAwesome/css/font-awesome.css><link rel=stylesheet href=../fonts/fonts.css><link rel=stylesheet href=../highlight.css><link rel=stylesheet href=../tomorrow-night.css><link rel=stylesheet href=../ayu-highlight.css><link rel=stylesheet href=../theme/style1.css><body><script>var path_to_root="../",default_theme=window.matchMedia("(prefers-color-scheme: dark)").matches?"navy":"light"</script><script>try{var theme=localStorage.getItem("mdbook-theme"),sidebar=localStorage.getItem("mdbook-sidebar");theme.startsWith('"')&&theme.endsWith('"')&&localStorage.setItem("mdbook-theme",theme.slice(1,theme.length-1)),sidebar.startsWith('"')&&sidebar.endsWith('"')&&localStorage.setItem("mdbook-sidebar",sidebar.slice(1,sidebar.length-1))}catch(e){}</script><script>var theme;try{theme=localStorage.getItem("mdbook-theme")}catch(e){}null==theme&&(theme=default_theme);var html=document.querySelector("html");html.classList.remove("no-js"),html.classList.remove("light"),html.classList.add(theme),html.classList.add("js")</script><script>var html=document.querySelector("html"),sidebar="hidden";if(document.body.clientWidth>=1080){try{sidebar=localStorage.getItem("mdbook-sidebar")}catch(e){}sidebar=sidebar||"visible"}html.classList.remove("sidebar-visible"),html.classList.add("sidebar-"+sidebar)</script><nav id=sidebar class=sidebar aria-label="Table of contents"><div class=sidebar-scrollbox><ol class=chapter><li class="chapter-item expanded affix"><a href=../about.html>Rusty Book</a><li class="chapter-item expanded affix"><li class=part-title>Awesome<li class=spacer><li class="chapter-item expanded"><a href=../daily-dev.html>日常开发常用库</a><li class="chapter-item expanded"><a href=../superstar.html>Rust 明星项目</a><li class="chapter-item expanded"><a href=../empowering-js.html>使用 Rust 增强 JS</a><li class="chapter-item expanded"><a href=../games.html>Rust开发的游戏</a><li class="chapter-item expanded"><a href=../gamedev.html>游戏引擎</a><li class="chapter-item expanded affix"><li class=part-title>Awesome + Cookbook<li class=spacer><li class="chapter-item expanded"><a href=../algos/awesome.html>实用算法</a><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../algos/randomness.html>生成随机值</a><li class="chapter-item expanded"><a href=../algos/sorting.html>Vec 排序</a><li class="chapter-item expanded"><div>压缩算法</div><a class=toggle><div></div></a><li><ol class=section><li class=chapter-item><a href=../algos/compression/tar.html>使用.tar包</a></ol><li class="chapter-item expanded"><div>密码学</div><a class=toggle><div></div></a><li><ol class=section><li class=chapter-item><a href=../algos/cryptography/hashing.html>哈希</a><li class=chapter-item><a href=../algos/cryptography/encryption.html>加密</a></ol><li class="chapter-item expanded"><div>数学计算</div><a class=toggle><div></div></a><li><ol class=section><li class=chapter-item><a href=../algos/math/linear-algebra.html>线性代数</a><li class=chapter-item><a href=../algos/math/trigonometry.html>三角函数</a><li class=chapter-item><a href=../algos/math/complex.html>复数</a><li class=chapter-item><a href=../algos/math/statistics.html>统计学</a><li class=chapter-item><a href=../algos/math/misc.html>杂项</a></ol></ol><li class="chapter-item expanded"><a href=../datastructures/awesome.html>数据结构</a><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../datastructures/bitfield.html>位字段</a></ol><li class="chapter-item expanded"><a href=../cmd/awesome.html>命令行</a><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../cmd/parsing.html>参数解析</a><li class="chapter-item expanded"><a href=../cmd/ansi.html>终端输出格式化</a></ol><li class="chapter-item expanded"><a href=../os/awesome.html>操作系统</a><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../os/processor.html>处理器</a><li class="chapter-item expanded"><a href=../os/command.html>调用系统命令</a></ol><li class="chapter-item expanded"><div>并发</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../cocurrency/threads.html>线程</a><li class="chapter-item expanded"><a href=../cocurrency/parallel.html>使用rayon并行处理数据</a></ol><li class="chapter-item expanded"><div>数据库</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../database/sqlite.html>SQLite</a><li class="chapter-item expanded"><a href=../database/postgres.html>Postgres</a></ol><li class="chapter-item expanded"><div>日期和时间</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../datetime/duration.html>时间计算和转换</a><li class="chapter-item expanded"><a href=../datetime/parsing.html>解析和显示</a></ol><li class="chapter-item expanded"><div>开发者工具</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../devtools/log.html>日志</a><li class="chapter-item expanded"><a href=../devtools/config-log.html class=active>配置日志</a><li class="chapter-item expanded"><a href=../devtools/version.html>版本号</a><li class="chapter-item expanded"><a href=../devtools/build-tools.html>构建时工具</a></ol><li class="chapter-item expanded"><div>编解码</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../encoding/strings.html>字符编码</a><li class="chapter-item expanded"><a href=../encoding/csv.html>CSV</a><li class="chapter-item expanded"><a href=../encoding/structured.html>结构化数据</a></ol><li class="chapter-item expanded"><div>错误处理</div><li class="chapter-item expanded"><div>文件操作</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../files/read-write.html>文件读写</a><li class="chapter-item expanded"><a href=../files/dir.html>目录访问</a></ol><li class="chapter-item expanded"><div>内存管理</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../memory/global-vars.html>全局变量</a></ol><li class="chapter-item expanded"><div>网络协议</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../protocols/tcpip.html>TCP/IP</a></ol><li class="chapter-item expanded"><div>文本处理</div><a class=toggle><div></div></a><li><ol class=section><li class="chapter-item expanded"><a href=../text/regex.html>正则表达式</a><li class="chapter-item expanded"><a href=../text/string.html>字符串解析</a></ol></ol></div><div id=sidebar-resize-handle class=sidebar-resize-handle></div></nav><div id=page-wrapper class=page-wrapper><div class=page><div id=menu-bar-hover-placeholder></div><div id=menu-bar class="menu-bar sticky bordered"><div class=left-buttons><button id=sidebar-toggle class=icon-button type=button title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls=sidebar><i class="fa fa-bars"></i></button> <button id=theme-toggle class=icon-button type=button title="Change theme" aria-label="Change theme" aria-haspopup=true aria-expanded=false aria-controls=theme-list><i class="fa fa-paint-brush"></i></button><ul id=theme-list class=theme-popup aria-label=Themes role=menu><li role=none><button role=menuitem class=theme id=light>Light (default)</button><li role=none><button role=menuitem class=theme id=rust>Rust</button><li role=none><button role=menuitem class=theme id=coal>Coal</button><li role=none><button role=menuitem class=theme id=navy>Navy</button><li role=none><button role=menuitem class=theme id=ayu>Ayu</button></ul><button id=search-toggle class=icon-button type=button title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded=false aria-keyshortcuts=S aria-controls=searchbar><i class="fa fa-search"></i></button></div><h1 class=menu-title>Rusty Book(锈书)</h1><div class=right-buttons><a href=../print.html title="Print this book" aria-label="Print this book"><i id=print-button class="fa fa-print"></i> </a><a href=https://github.com/studyrs/rusty-book title="Git repository" aria-label="Git repository"><i id=git-repository-button class="fa fa-github"></i> </a><a href=https://github.com/studyrs/rusty-book/edit/main/src/devtools/config-log.md title="Suggest an edit" aria-label="Suggest an edit"><i id=git-edit-button class="fa fa-edit"></i></a></div></div><div id=search-wrapper class=hidden><form id=searchbar-outer class=searchbar-outer><input type=search id=searchbar name=searchbar placeholder="Search this book ..." aria-controls=searchresults-outer aria-describedby=searchresults-header></form><div id=searchresults-outer class="searchresults-outer hidden"><div id=searchresults-header class=searchresults-header></div><ul id=searchresults></ul></div></div><script>document.getElementById("sidebar-toggle").setAttribute("aria-expanded","visible"===sidebar),document.getElementById("sidebar").setAttribute("aria-hidden","visible"!==sidebar),Array.from(document.querySelectorAll("#sidebar a")).forEach((function(e){e.setAttribute("tabIndex","visible"===sidebar?0:-1)}))</script><div id=content class=content><div class=sidetoc><nav class=pagetoc></nav></div><main><h1 id=配置日志><a class=header href=#配置日志>配置日志</a></h1><h3 id=为每个模块开启独立的日志级别><a class=header href=#为每个模块开启独立的日志级别>为每个模块开启独立的日志级别</a></h3><p>下面代码创建了模块 <code>foo</code> 和嵌套模块 <code>foo::bar</code>,并通过 <a href=https://docs.rs/env_logger/*/env_logger/#enabling-logging>RUST_LOG</a> 环境变量对各自的日志级别进行了控制。<pre><pre class=playground><code class="language-rust editable edition2021">mod foo {
mod bar {
pub fn run() {
log::warn!(&quot;[bar] warn&quot;);
log::info!(&quot;[bar] info&quot;);
log::debug!(&quot;[bar] debug&quot;);
}
}
pub fn run() {
log::warn!(&quot;[foo] warn&quot;);
log::info!(&quot;[foo] info&quot;);
log::debug!(&quot;[foo] debug&quot;);
bar::run();
}
}
fn main() {
env_logger::init();
log::warn!(&quot;[root] warn&quot;);
log::info!(&quot;[root] info&quot;);
log::debug!(&quot;[root] debug&quot;);
foo::run();
}
</code></pre></pre><p>要让环境变量生效,首先需要通过 <code>env_logger::init()</code> 开启相关的支持。然后通过以下命令来运行程序:<pre><code class=language-shell>RUST_LOG=&quot;warn,test::foo=info,test::foo::bar=debug&quot; ./test
</code></pre><p>此时的默认日志级别被设置为 <code>warn</code>,但我们还将 <code>foo</code> 模块级别设置为 <code>info</code>, <code>foo::bar</code> 模块日志级别设置为 <code>debug</code><pre><code class=language-bash>WARN:test: [root] warn
WARN:test::foo: [foo] warn
INFO:test::foo: [foo] info
WARN:test::foo::bar: [bar] warn
INFO:test::foo::bar: [bar] info
DEBUG:test::foo::bar: [bar] debug
</code></pre><h3 id=使用自定义环境变量来设置日志><a class=header href=#使用自定义环境变量来设置日志>使用自定义环境变量来设置日志</a></h3><p><a href=https://docs.rs/env_logger/*/env_logger/struct.Builder.html>Builder</a> 将对日志进行配置,以下代码使用 <code>MY_APP_LOG</code> 来替代 <code>RUST_LOG</code> 环境变量:<pre><pre class=playground><code class="language-rust editable edition2021">use std::env;
use env_logger::Builder;
fn main() {
Builder::new()
.parse(&amp;env::var(&quot;MY_APP_LOG&quot;).unwrap_or_default())
.init();
log::info!(&quot;informational message&quot;);
log::warn!(&quot;warning message&quot;);
log::error!(&quot;this is an error {}&quot;, &quot;message&quot;);
}
</code></pre></pre><h3 id=在日志中包含时间戳><a class=header href=#在日志中包含时间戳>在日志中包含时间戳</a></h3><pre><pre class=playground><code class="language-rust editable edition2021">use std::io::Write;
use chrono::Local;
use env_logger::Builder;
use log::LevelFilter;
fn main() {
Builder::new()
.format(|buf, record| {
writeln!(buf,
&quot;{} [{}] - {}&quot;,
Local::now().format(&quot;%Y-%m-%dT%H:%M:%S&quot;),
record.level(),
record.args()
)
})
.filter(None, LevelFilter::Info)
.init();
log::warn!(&quot;warn&quot;);
log::info!(&quot;info&quot;);
log::debug!(&quot;debug&quot;);
}
</code></pre></pre><p>以下是 <code>stderr</code> 的输出:<pre><code class=language-shell>2022-03-22T21:57:06 [WARN] - warn
2022-03-22T21:57:06 [INFO] - info
</code></pre><h3 id=将日志输出到指定文件><a class=header href=#将日志输出到指定文件>将日志输出到指定文件</a></h3><p><a href=https://docs.rs/log4rs/ >log4rs</a> 可以帮我们将日志输出指定的位置,它可以使用外部 YAML 文件或 <code>builder</code> 的方式进行配置。<pre><pre class=playground><code class="language-rust editable edition2021"><span class=boring>use error_chain::error_chain;
</span>
use log::LevelFilter;
use log4rs::append::file::FileAppender;
use log4rs::encode::pattern::PatternEncoder;
use log4rs::config::{Appender, Config, Root};
<span class=boring>error_chain! {
</span><span class=boring> foreign_links {
</span><span class=boring> Io(std::io::Error);
</span><span class=boring> LogConfig(log4rs::config::Errors);
</span><span class=boring> SetLogger(log::SetLoggerError);
</span><span class=boring> }
</span><span class=boring>}
</span>
fn main() -&gt; Result&lt;()&gt; {
// 创建日志配置,并指定输出的位置
let logfile = FileAppender::builder()
// 编码模式的详情参见: https://docs.rs/log4rs/1.0.0/log4rs/encode/pattern/index.html
.encoder(Box::new(PatternEncoder::new(&quot;{l} - {m}\n&quot;)))
.build(&quot;log/output.log&quot;)?;
let config = Config::builder()
.appender(Appender::builder().build(&quot;logfile&quot;, Box::new(logfile)))
.build(Root::builder()
.appender(&quot;logfile&quot;)
.build(LevelFilter::Info))?;
log4rs::init_config(config)?;
log::info!(&quot;Hello, world!&quot;);
Ok(())
}
</code></pre></pre><div id=giscus-container></div></main><nav class=nav-wrapper aria-label="Page navigation"><a rel=prev href=../devtools/log.html class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../devtools/version.html class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a><div style=clear:both></div></nav></div></div><nav class=nav-wide-wrapper aria-label="Page navigation"><a rel=prev href=../devtools/log.html class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts=Left><i class="fa fa-angle-left"></i> </a><a rel=next href=../devtools/version.html class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts=Right><i class="fa fa-angle-right"></i></a></nav></div><script>window.playground_copyable=!0</script><script src=../ace.js charset=utf-8></script><script src=../editor.js charset=utf-8></script><script src=../mode-rust.js charset=utf-8></script><script src=../theme-dawn.js charset=utf-8></script><script src=../theme-tomorrow_night.js charset=utf-8></script><script src=../elasticlunr.min.js charset=utf-8></script><script src=../mark.min.js charset=utf-8></script><script src=../searcher.js charset=utf-8></script><script src=../clipboard.min.js charset=utf-8></script><script src=../highlight.js charset=utf-8></script><script src=../book.js charset=utf-8></script><script>var pagePath="devtools/config-log.md"</script><script src=../assets/custom1.js></script><script src=../assets/bigPicture.js></script>