mirror of
https://github.com/shadowsocks/shadowsocks-rust.git
synced 2026-11-06 16:14:11 +00:00
* Refactored and separate library into crates
- shadowsocks: the core feature of shadowsocks
- shadowsocks-service: library for building shadowsocks services
- dns, http, redir, socks, tunnel
- load balancer
- shadowsocks-rust: release binaries
fix #347
* unified DnsResolver implementation
* unified local service common parameters into ServiceContext
- ServiceContext is common parameters shared between all local
implementations
- Completely removed https local support
* add #292 reply attack protection
* migrated redir local server
* support customizing outbound socket bind address
* manager outbound socket should accepts connect_opts
* republic local implementations
* socks5 udp server should always listen to client address
* socks4 controlled by local-socks4 feature
* socks4 also obey mode configuration
* socks server tcp cannot be disable. add support of udp-bind-addr parameter
* add udp-bind-addr for customizing udp-relay bind-addr
* local-dns infra, support customizing resolver
* fully implements DNS relay server
* support binding to specific interface on Linux-like platform
* tcp cannot be disabled in socks
* enable local-flow-stat
* fixed windows build
* fixed android specific warnings and compile errors
* allow udp_only mode in socks5
* dns relay listens to both TCP and UDP, mode controls outbound upstreams
* dns relay retries twice if request failed
* doc
* fix DnsClient typo
* fix stream EncryptWriter bug
* allow disable logging output
updated dependencies
* add readme
* refine doc
* remove depending on trust-dns-client
* socks4/4a client
* allow socks5 udp_only mode, fixes compile warning
* create standalone socks5 UDP relay server
- socks5 UDP association full cone (NAT2)
* server udp relay supports full cone (NAT2)
* acl moved to crate root
* redir udp relay support full cone (NAT2)
* standard socks5 udp test must use tcp_and_udp mode
* set server context fields with pub APIs
* udp_max_associations and udp_timeout default value set in Config
* local dns resolver retry with fixed attempts
* max_udp_association keeps unlimited by default
* fixed logging binary name
* pops first exited future result for local and server
* update reverse target index cache
* fix ProxyClientStreamWriteHalf that allows sending empty buffers
ref #232
* remove unused import when socks4 is disabled
* make balancer become a globally shared object
* print plugin exit status
* control local, server, manager services in features
73 lines
2.7 KiB
Rust
73 lines
2.7 KiB
Rust
//! Loggin facilities
|
|
|
|
use std::path::Path;
|
|
|
|
use clap::ArgMatches;
|
|
use log::LevelFilter;
|
|
use log4rs::{
|
|
append::console::{ConsoleAppender, Target},
|
|
config::{Appender, Config, Logger, Root},
|
|
encode::pattern::PatternEncoder,
|
|
};
|
|
|
|
pub fn init_with_file<P>(path: P)
|
|
where
|
|
P: AsRef<Path>,
|
|
{
|
|
log4rs::init_file(path, Default::default()).expect("init logging with file");
|
|
}
|
|
|
|
pub fn init_with_config(bin_name: &str, matches: &ArgMatches) {
|
|
let debug_level = matches.occurrences_of("VERBOSE");
|
|
let without_time = matches.is_present("LOG_WITHOUT_TIME");
|
|
|
|
let mut pattern = String::new();
|
|
if !without_time {
|
|
pattern += "{d} ";
|
|
}
|
|
pattern += "{h({l}):<5} ";
|
|
if debug_level >= 1 {
|
|
pattern += "[{P}:{I}] [{M}] ";
|
|
}
|
|
pattern += "{m}{n}";
|
|
|
|
let logging_builder = Config::builder().appender(
|
|
Appender::builder().build(
|
|
"console",
|
|
Box::new(
|
|
ConsoleAppender::builder()
|
|
.encoder(Box::new(PatternEncoder::new(&pattern)))
|
|
.target(Target::Stderr)
|
|
.build(),
|
|
),
|
|
),
|
|
);
|
|
|
|
let config = match debug_level {
|
|
0 => logging_builder
|
|
.logger(Logger::builder().build(bin_name, LevelFilter::Info))
|
|
.logger(Logger::builder().build("shadowsocks", LevelFilter::Info))
|
|
.logger(Logger::builder().build("shadowsocks_service", LevelFilter::Info))
|
|
.build(Root::builder().appender("console").build(LevelFilter::Off)),
|
|
1 => logging_builder
|
|
.logger(Logger::builder().build(bin_name, LevelFilter::Debug))
|
|
.logger(Logger::builder().build("shadowsocks", LevelFilter::Debug))
|
|
.logger(Logger::builder().build("shadowsocks_service", LevelFilter::Debug))
|
|
.build(Root::builder().appender("console").build(LevelFilter::Off)),
|
|
2 => logging_builder
|
|
.logger(Logger::builder().build(bin_name, LevelFilter::Trace))
|
|
.logger(Logger::builder().build("shadowsocks", LevelFilter::Trace))
|
|
.logger(Logger::builder().build("shadowsocks_service", LevelFilter::Trace))
|
|
.build(Root::builder().appender("console").build(LevelFilter::Off)),
|
|
3 => logging_builder
|
|
.logger(Logger::builder().build(bin_name, LevelFilter::Trace))
|
|
.logger(Logger::builder().build("shadowsocks", LevelFilter::Trace))
|
|
.logger(Logger::builder().build("shadowsocks_service", LevelFilter::Trace))
|
|
.build(Root::builder().appender("console").build(LevelFilter::Debug)),
|
|
_ => logging_builder.build(Root::builder().appender("console").build(LevelFilter::Trace)),
|
|
}
|
|
.expect("logging");
|
|
|
|
log4rs::init_config(config).expect("logging");
|
|
}
|