2017-12-04 05:47:15 +01:00
|
|
|
# Middlewares
|
|
|
|
|
|
|
|
## Logging
|
|
|
|
|
|
|
|
Logging is implemented as middleware. Middlewares get executed in same order as registraton order.
|
|
|
|
It is common to register logging middleware as first middleware for application.
|
|
|
|
Logging middleware has to be registered for each application.
|
|
|
|
|
|
|
|
### Usage
|
|
|
|
|
|
|
|
Create `Logger` middlewares with the specified `format`.
|
|
|
|
Default `Logger` could be created with `default` method, it uses the default format:
|
|
|
|
|
|
|
|
```ignore
|
|
|
|
%a %t "%r" %s %b "%{Referrer}i" "%{User-Agent}i" %T
|
|
|
|
```
|
|
|
|
```rust
|
2017-12-06 20:00:39 +01:00
|
|
|
# extern crate actix_web;
|
2017-12-04 05:47:15 +01:00
|
|
|
use actix_web::Application;
|
|
|
|
use actix_web::middlewares::Logger;
|
|
|
|
|
|
|
|
fn main() {
|
2017-12-11 23:16:29 +01:00
|
|
|
Application::new()
|
2017-12-04 05:47:15 +01:00
|
|
|
.middleware(Logger::default())
|
|
|
|
.middleware(Logger::new("%a %{User-Agent}i"))
|
|
|
|
.finish();
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Here is example of default logging format:
|
|
|
|
|
|
|
|
```
|
|
|
|
INFO:actix_web::middlewares::logger: 127.0.0.1:59934 [02/Dec/2017:00:21:43 -0800] "GET / HTTP/1.1" 302 0 "-" "curl/7.54.0" 0.000397
|
|
|
|
INFO:actix_web::middlewares::logger: 127.0.0.1:59947 [02/Dec/2017:00:22:40 -0800] "GET /index.html HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:57.0) Gecko/20100101 Firefox/57.0" 0.000646
|
|
|
|
```
|
|
|
|
|
|
|
|
### Format
|
|
|
|
|
|
|
|
`%%` The percent sign
|
|
|
|
|
|
|
|
`%a` Remote IP-address (IP-address of proxy if using reverse proxy)
|
|
|
|
|
|
|
|
`%t` Time when the request was started to process
|
|
|
|
|
|
|
|
`%P` The process ID of the child that serviced the request
|
|
|
|
|
|
|
|
`%r` First line of request
|
|
|
|
|
|
|
|
`%s` Response status code
|
|
|
|
|
|
|
|
`%b` Size of response in bytes, including HTTP headers
|
|
|
|
|
2017-12-04 22:32:05 +01:00
|
|
|
`%T` Time taken to serve the request, in seconds with floating fraction in .06f format
|
2017-12-04 05:47:15 +01:00
|
|
|
|
|
|
|
`%D` Time taken to serve the request, in milliseconds
|
|
|
|
|
|
|
|
`%{FOO}i` request.headers['FOO']
|
|
|
|
|
|
|
|
`%{FOO}o` response.headers['FOO']
|
|
|
|
|
|
|
|
`%{FOO}e` os.environ['FOO']
|
|
|
|
|
|
|
|
|
|
|
|
## Default headers
|
|
|
|
|
2017-12-11 23:27:09 +01:00
|
|
|
To set default response headers `DefaultHeaders` middleware could be used.
|
|
|
|
*DefaultHeaders* middleware does not set header if response headers contains header.
|
2017-12-04 05:47:15 +01:00
|
|
|
|
|
|
|
```rust
|
2017-12-06 20:00:39 +01:00
|
|
|
# extern crate actix_web;
|
2017-12-04 05:47:15 +01:00
|
|
|
use actix_web::*;
|
|
|
|
|
|
|
|
fn main() {
|
2017-12-11 23:16:29 +01:00
|
|
|
let app = Application::new()
|
2017-12-04 05:47:15 +01:00
|
|
|
.middleware(
|
|
|
|
middlewares::DefaultHeaders::build()
|
|
|
|
.header("X-Version", "0.2")
|
|
|
|
.finish())
|
|
|
|
.resource("/test", |r| {
|
2017-12-04 23:07:53 +01:00
|
|
|
r.method(Method::GET).f(|req| httpcodes::HTTPOk);
|
|
|
|
r.method(Method::HEAD).f(|req| httpcodes::HTTPMethodNotAllowed);
|
2017-12-04 05:47:15 +01:00
|
|
|
})
|
|
|
|
.finish();
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
## User sessions
|