Actix Web에 Slog Logger 추가
Actix web은 Rust를 위한 강력하고 실용적이며 매우 빠른 웹 프레임워크이며 Slog은 Rust를 위한 구조화되고 확장 가능하며 구성 가능한 로깅을 위한 재사용 가능한 구성 요소의 생태계입니다. 핵심 슬로그 코어 패키지와 함께
slog-async
및 slog-term
두 개의 슬로그 상자를 사용할 것입니다.왜 Slog가 기본 로그 크레이트보다 많습니까?
사용한 상자
Actix Web : 강력한 웹 프레임워크입니다.
Slog Core Crate : 로깅 모듈의 게이트웨이에 대한 핵심 패키지입니다.
Slog Term : slog-rs용 Unix 터미널 드레인 및 포맷터입니다.
Slog Term : slog-rs에 대한 비동기 드레인입니다.
크레이트 버전 및 코드
cargo.toml
파일에 코드를 붙여넣기만 하면 됩니다.slog = "2.7.0"
slog-term = "2.9.0"
slog-async = "2.7.0"
Actix 웹용 기본 템플릿
Actix 웹의 기본hello world program입니다.
use actix_web::{ web, App, HttpServer};
async fn index() -> &'static str {
"Hello world!"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
println!("Starting the server at 127.0.0.1:8080");
HttpServer::new(|| {
App::new()
.service(web::resource("/index.html").to(|| async { "Hello world!" }))
.service(web::resource("/").to(index))
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
로거 구성
use slog;
use slog::{Logger,o,Drain,info};
use slog_term;
use slog_async;
fn configure_log()->Logger{
let decorator = slog_term::TermDecorator::new().build();
let console_drain = slog_term::FullFormat::new(decorator).build().fuse();
// It is used for Synchronization
let console_drain = slog_async::Async::new(console_drain).build().fuse();
// Root logger
slog::Logger::root(console_drain,o!("v"=>env!("CARGO_PKG_VERSION")))
}
구성 기능을 중단하고 장면 뒤에서 무슨 일이 일어나고 있는지 이해해 봅시다.
TermDecorator Decorator : IT는 용어 상자를 사용하여 구현된 터미널 출력을 형식화하는 데 사용됩니다. 이 데코레이터는 출력하는 로그에 멋진 서식을 추가합니다. 참고 !Sync는 직렬화를 처리하지 않습니다. slog_async::Async를 사용하여 별도의 스레드에서 실행합니다. 우리는 그것과 함께 slog async를 사용할 것입니다. 필요에 따라 CompactFormat, PlainRecordDecorator 등을 사용할 수 있습니다other decorator.
FullFormat : Decorator를 인수로 받아 터미널 출력에 사용되는 Drain입니다. 데코레이터는 포맷용이고 드레인은 출력용입니다.
Async Slog를 통한 동기화: PlainSyncDecorator 및 slog_async가 필요에 따라 효율적인 동기화를 수행하는 세 가지 방법 slog입니다. 두 가지 외에 Mutex를 통한 마지막 동기화는 효율적이지 않습니다. 더 읽을 수 있습니다here. slog_async와 동기화를 사용하고 있습니다.
Logger::root : Logger은 로깅 문을 실행하는 데 사용됩니다. 두 가지 인수가 필요합니다
drain - 로깅을 전달할 대상 처리를 위한 레코드입니다.
컨텍스트 - 연관된 키-값 쌍 목록입니다.
영형! : Logger에서 콘텐츠로 사용되는 키-값 쌍 그룹을 구축하기 위한 매크로입니다.
fuse() : 무언가 잘못되었을 때 패닉에 사용됩니다. 루트 로거는 오류가 없는 드레인을 취해야 하므로 퓨즈를 호출해야 합니다.
핸들러에 로그 인스턴스 전달
main 함수에 다음 코드 줄을 추가합니다.
let log = configure_log();
이제 로거를 구성하고 사용할 준비가 됩니다.
로그 인스턴스 전달
HttpServer::new(move || {
App::new()
.app_data(web::Data::new(log.clone()))
.service(web::resource("/index.html").to(|| async { "Hello world!" }))
.service(web::resource("/").to(index))
})
.bind(("127.0.0.1", 8080))?
.run()
.await
web::Data::new(log.clone()) : 런타임 시 HttpRequest::app_data 메서드를 통해 사용할 수 있는 App::app_data() 메서드로 저장된 애플리케이션 데이터입니다.
함수 핸들러에서 Log 인스턴스에 액세스
async fn index(log: web::Data<Logger>) -> &'static str {
info!(log,
"Inside Hello World"
);
"Hello world!"
}
정보! : Logger가 출력하기 위해 사용하는 Info Level Record Or Context(key-value pair)를 구축하는데 사용되는 매크로입니다. 사용할 수 있는 여러 매크로입니다different level records.
로그: 웹::데이터 : -
애플리케이션 등록을 위한 Essentials 도우미 기능 및 유형입니다.
요청 추출기
메인 함수에서 서버 인스턴스에서 초기화된 애플리케이션 데이터에 액세스하기 위해
Data
메서드를 사용하고 있습니다.완전한 코드
use actix_web::{web, App, HttpServer};
// IT is used as a logging middleware. We can even use the default logger with actix.
use slog;
use slog::{Logger,o,Drain,info};
use slog_term;
use slog_async;
fn configure_log()->Logger{
// Formatting the output https://docs.rs/slog-term/2.9.0/slog_term/index.html#
let decorator = slog_term::TermDecorator::new().build();
// Drain for outputting https://docs.rs/slog-term/2.9.0/slog_term/index.html#structs
// fuse is used for panicking if something went wrong. It is necessary to call fuse as the root logger must take a Drain which is error free.
let console_drain = slog_term::FullFormat::new(decorator).build().fuse();
// It is used for Synchronization https://docs.rs/slog-term/2.9.0/slog_term/index.html#structs
let console_drain = slog_async::Async::new(console_drain).build().fuse();
slog::Logger::root(console_drain,o!("v"=>env!("CARGO_PKG_VERSION")))
}
async fn index(log: web::Data<Logger>) -> &'static str {
info!(log,
"Inside Hello World"
);
"Hello world!"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let log = configure_log();
info!(log,
"Starting the server at http://127.0.0.1:8080/"
);
HttpServer::new(move || {
App::new()
.app_data(web::Data::new(log.clone()))
.service(web::resource("/index.html").to(|| async { "Hello world!" }))
.service(web::resource("/").to(index))
})
.bind(("127.0.0.1", 8080))?
.run()
.await
}
로깅 출력
소스 코드
GitHub Source Code
빠른 수정과 이해를 위해 설명을 추가했습니다.
언제든지 질문하거나 제안을 제공하십시오. 나는 너무 배우고있다. 따라서 귀하의 피드백을 기꺼이 받을 것입니다. 행복한 해킹! 러스타시안!
Reference
이 문제에 관하여(Actix Web에 Slog Logger 추가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chaudharypraveen98/adding-slog-logger-to-actix-web-2332텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)