use level;
use level::LogLevel;
use internal::comm::send_logger_message;
use internal::task::{LoggerMessage, DefaultLogTarget};
use std::path::PathBuf;
#[cfg(feature = "log")]
pub use self::logsupport::*;
use internal::task::INTERNAL_LOGGER_NAME;
use MessageFormatter;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct Logger{
name:String
}
#[derive(Clone, PartialEq, Eq)]
pub enum LoggerOutput{
FileLog(PathBuf),
StdoutLog,
StderrLog,
MultiLog(Vec<String>),
}
impl Logger{
pub fn set_default_formatter(fmtr:Box<MessageFormatter>) {
send_logger_message(LoggerMessage::SetDefaultFormatter(fmtr));
}
pub fn access(name: &str) -> Logger {
Logger{name: name.to_string()}
}
pub fn access_internal_logger() -> Logger {
Logger::access(INTERNAL_LOGGER_NAME)
}
pub fn new(name: &str, ty: LoggerOutput) -> Logger{
Logger::new_with_level(name, ty, level::DEFAULT)
}
pub fn new_with_level(name: &str, ty: LoggerOutput, level:LogLevel) -> Logger {
send_logger_message(LoggerMessage::NewLogger(name.to_string(),
level,
ty));
Logger::access(name)
}
pub fn redirect(&self, ty: LoggerOutput) {
send_logger_message(
LoggerMessage::RedirectLogger(
self.name.to_string(),
None,
ty));
}
pub fn redirect_set_level(&self, ty: LoggerOutput, level: LogLevel) {
send_logger_message(
LoggerMessage::RedirectLogger(
self.name.to_string(),
Some(level),
ty));
}
pub fn disable(self) {
send_logger_message(LoggerMessage::Disable(self.name, true));
}
pub fn disable_without_logs(self) {
send_logger_message(LoggerMessage::Disable(self.name, false));
}
pub fn set_as_default(&self) {
send_logger_message(
LoggerMessage::SetDefaultLogTarget(
DefaultLogTarget::LogToTarget(self.name.to_string())))
}
pub fn set_as_silent_default(&self) {
send_logger_message(
LoggerMessage::SetDefaultLogTarget(
DefaultLogTarget::LogToTargetNoIndicator(self.name.to_string())))
}
pub fn set_format(&self, formatter: Box<MessageFormatter>) {
send_logger_message(LoggerMessage::SetFormatter(self.name.to_string(), formatter));
}
pub fn log(&self, level: LogLevel, message:&str){
send_logger_message(
LoggerMessage::LogMessage(
self.name.clone(),
level,
message.to_string()));
}
pub fn wtf(&self, message:&str){
self.log(level::WTF, message);
}
pub fn critical(&self, message:&str){
self.log(level::CRITICAL, message);
}
pub fn severe(&self, message:&str){
self.log(level::SEVERE, message);
}
pub fn warning(&self, message:&str){
self.log(level::WARNING, message)
}
pub fn debug(&self, message:&str){
self.log(level::DEBUG, message);
}
pub fn info(&self, message:&str){
self.log(level::INFO, message);
}
pub fn trace(&self, message:&str) {
self.log(level::TRACE, message);
}
pub fn verbose(&self, message:&str){
self.log(level::VERBOSE, message);
}
}
#[cfg(feature = "log")]
mod logsupport{
use internal::task::LoggerMessage;
use std::sync::mpsc::channel;
use internal::comm::send_logger_message;
use level;
use log;
pub struct ArtifactDelegateLog;
impl log::Log for ArtifactDelegateLog {
fn enabled(&self, metadata: &log::LogMetadata) -> bool {
let (tx, rx) = channel();
send_logger_message(
LoggerMessage::IsLogEnabled(
metadata.target().to_owned(),
to_internal_level(metadata.level()),
tx));
match rx.recv() {
Ok(rval) => rval,
_ => false
}
}
fn log(&self, record:&log::LogRecord){
send_logger_message(
LoggerMessage::LogMessage(
record.target().to_owned(),
to_internal_level(record.level()),
format!("{}", record.args())));
}
}
#[cfg(feature = "log")]
fn to_internal_level(lvl: log::LogLevel) -> level::LogLevel {
use log::LogLevel::*;
match lvl {
Error => level::SEVERE,
Warn => level::WARNING,
Info => level::INFO,
Debug => level::DEBUG,
Trace => level::TRACE
}
}
}