Actix Web에 Slog Logger 추가

Actix 웹 로그인을 위해 slog logger를 사용하는 방법을 배웁니다.
Actix web은 Rust를 위한 강력하고 실용적이며 매우 빠른 웹 프레임워크이며 Slog은 Rust를 위한 구조화되고 확장 가능하며 구성 가능한 로깅을 위한 재사용 가능한 구성 요소의 생태계입니다. 핵심 슬로그 코어 패키지와 함께 slog-asyncslog-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 도우미 기능 및 유형입니다.

    요청 추출기
  • 데이터: 애플리케이션 데이터 항목
  • ReqData: 요청-로컬 데이터 항목
  • 경로: URL 경로 매개변수/동적 세그먼트
  • 쿼리: URL 쿼리 매개변수
  • 헤더: 입력된 헤더
  • Json: JSON 페이로드
  • 양식: URL 인코딩 페이로드
  • 바이트: 원시 페이로드

  • 메인 함수에서 서버 인스턴스에서 초기화된 애플리케이션 데이터에 액세스하기 위해 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

    빠른 수정과 이해를 위해 설명을 추가했습니다.

    언제든지 질문하거나 제안을 제공하십시오. 나는 너무 배우고있다. 따라서 귀하의 피드백을 기꺼이 받을 것입니다. 행복한 해킹! 러스타시안!

    좋은 웹페이지 즐겨찾기