package blog4go

import (
"encoding/xml"
"errors"
"io/ioutil"
"os"
)

const (
// TypeTimeBaseRotate is time base logrotate tag
TypeTimeBaseRotate = "time"
// TypeSizeBaseRotate is size base logrotate tag
TypeSizeBaseRotate = "size"
)

var (
// ErrConfigFiltersNotFound not found filters
ErrConfigFiltersNotFound = errors.New("Please define at least one filter")
// ErrConfigBadAttributes wrong attribute
ErrConfigBadAttributes = errors.New("Bad attributes setting")
// ErrConfigLevelsNotFound not found levels
ErrConfigLevelsNotFound = errors.New("Please define levels attribution")
// ErrConfigFilePathNotFound not found file path
ErrConfigFilePathNotFound = errors.New("Please define the file path")
// ErrConfigFileRotateTypeNotFound not found rotate type
ErrConfigFileRotateTypeNotFound = errors.New("Please define the file rotate type")
// ErrConfigSocketAddressNotFound not found socket address
ErrConfigSocketAddressNotFound = errors.New("Please define a socket address")
// ErrConfigSocketNetworkNotFound not found socket port
ErrConfigSocketNetworkNotFound = errors.New("Please define a socket network type")
)

// Config struct define the config struct used for file wirter
type Config struct {
Filters  []filter `xml:"filter"`
MinLevel string   `xml:"minlevel,attr"`
}

// log filter
type filter struct {
Levels     string     `xml:"levels,attr"`
Colored    bool       `xml:"colored,attr"`
File       file       `xml:"file"`
RotateFile rotateFile `xml:"rotatefile"`
Console    console    `xml:"console"`
Socket     socket     `xml:"socket"`
}

type file struct {
Path string `xml:"path,attr"`
}

type rotateFile struct {
Path        string `xml:"path,attr"`
Type        string `xml:"type,attr"`
RotateLines int    `xml:"rotateLines,attr"`
RotateSize  int64  `xml:"rotateSize,attr"`
Retentions  int64  `xml:"retentions,attr"`
}

type console struct {
// redirect stderr to stdout
Redirect bool `xml:"redirect"`
}

type socket struct {
Network string `xml:"network,attr"`
Address string `xml:"address,attr"`
}

// check if config is valid
func (config *Config) valid() error {
// check minlevel validation
if "" != config.MinLevel && !LevelFromString(config.MinLevel).valid() {
return ErrConfigBadAttributes
}
// check filters len
if len(config.Filters) < 1 {
return ErrConfigFiltersNotFound
}

// check filter one by one
for _, filter := range config.Filters {
if "" == filter.Levels {
return ErrConfigLevelsNotFound
}

if (file{}) != filter.File {
// seem not needed now
//if "" == filter.File.Path {
//return ErrConfigFilePathNotFound
//}
} else if (rotateFile{}) != filter.RotateFile {
if "" == filter.RotateFile.Path {
return ErrConfigFilePathNotFound
}

if "" == filter.RotateFile.Type {
return ErrConfigFileRotateTypeNotFound
}
} else if (socket{}) != filter.Socket {
if "" == filter.Socket.Address {
return ErrConfigSocketAddressNotFound
}

if "" == filter.Socket.Network {
return ErrConfigSocketNetworkNotFound
}
}
}

return nil
}

// read config from a xml file
func readConfig(fileName string) (*Config, error) {
file, err := os.Open(fileName)
if nil != err {
return nil, err
}
defer file.Close()

in, err := ioutil.ReadAll(file)
if nil != err {
return nil, err
}

config := new(Config)
err = xml.Unmarshal(in, config)
if nil != err {
return nil, err
}

return config, err
}

config.go的更多相关文章

  1. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  2. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  3. [笔记]HAproxy reload config file with uninterrupt session

    HAProxy is a high performance load balancer. It is very light-weight, and free, making it a great op ...

  4. MyBatis2:config.xml文件

    前言 前一篇文章,讲了MyBatis入门,讲到了MyBatis有两个基本的配置文件,一个用来配置环境信息,一个用来写SQL语句.前者我把它命名为config.xml,config.xml的内容是: & ...

  5. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  6. WCF中,通过C#代码或App.config配置文件创建ServiceHost类

    C# static void Main(string[] args) { //创建宿主的基地址 Uri baseAddress = new Uri("http://localhost:808 ...

  7. myeclipse 无法启动 java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).

    把myeclipse10 按照目录完整拷贝到了另外一台电脑, 另外的目录 原安装目录 D\:\soft\i\myeclipse10 新安装目录 E\:\soft\myeclipse10 双击启动失败, ...

  8. PHP扩展-如何使用文件config.m4

    config.m4文件用于指定正在开发的扩展在类unix系统下构建时支持的选项,指定此扩展需要哪些库以及哪些源文件:使用 GNU autoconf 语法编写.注意需要重新执行phpize,config ...

  9. RabbitMQ Config

    默认访问地址:http://localhost:15672/ 要想修改内网访问: %APPDATA%\RabbitMQ\ 目录下添加文件 rabbitmq.config [ {rabbit, [%% ...

  10. C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案

    新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...

随机推荐

  1. MOOS通配符订阅

    MOOS通配符订阅 简介 通配符订阅是MOOSV10的重要进步,客户端可以通过此方式订阅名字和来源符合简单正则表达式的数据. 现在仅支持"*"和"?"两种通配符 ...

  2. ## 分享一下Mac(苹果电脑)里面好用的软件!

    该文章主要分享 Mac电脑常用的软件 文章来源于 github小弟调调™的仓库转载 说明 [Open-Source Software][OSS Icon] 表示 开源软件 ,点击进入 开源 仓库: ...

  3. Unknown entity: org.jbpm.services.task.audit.TaskEventImpl

    1. use this persistence.xml - simply copy it into src/main/resources/META-INF please note the name o ...

  4. 深入理解SpringCloud之配置刷新

    我们知道在SpringCloud中,当配置变更时,我们通过访问http://xxxx/refresh,可以在不启动服务的情况下获取最新的配置,那么它是如何做到的呢,当我们更改数据库配置并刷新后,如何能 ...

  5. python 之路,200行Python代码写了个打飞机游戏!

    早就知道pygame模块,就是没怎么深入研究过,恰逢这周未没约到妹子,只能自己在家玩自己啦,一时兴起,花了几个小时写了个打飞机程序. 很有意思,跟大家分享下. 先看一下项目结构 "" ...

  6. Python循环依赖问题的解决

    一个是把某个import移到代码中间,使原先的循环依赖圈打开.

  7. linux下安装apc

    wget htdtp://pecl.php.net/get/APC tar zxvf APC-3.1.3p.tgz cd APC-3.1.3p /usr/local/php/bin/phpize ./ ...

  8. RabbitMQ 安装 Your installed version of Erlang (6.2) is too old. Please install a more recent version.

    windows安装RabbitMQ时在安装完Erlang语言开发包后,再安装RabbitMQ时报错: Your installed version of Erlang (6.2) is too old ...

  9. ArcCore重构-头文件引用问题的初步解决

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5   基本问题 1. 头文件引用混乱,所有头文件通过从搜索路径(-I)中引用,存在名称污染问题,需加入路径信息:   ...

  10. QT中正则表达式的简单说明

    使用方法: QRegExp acNumRE("[0-9]{19}"); lineEdit->setValidator(new QRegExpValidator(acNumRE ...