码迷,mamicode.com
首页 > 编程语言 > 详细

使用GO语言实现的日志集中查看的小功能.

时间:2015-07-20 23:53:55      阅读:400      评论:0      收藏:0      [点我收藏+]

标签:golang   go语言   结构   服务器   游戏   

程序分为站点端和中心端(相当于一个proxy).

这个小功能主要是解决,程序经常让我们去拖日志,特别烦.所以做个小程序.使程序可以自己去线上查看.

有个问题是,不能把游戏服务器暴露出来,还有就是不能占用业务机器的公网带宽.

这个小程序主要就是中心端(proxy)通过内网获取文件,然后转发给访问端.

中心端主要有两个文件,一个是程序文件.一个是我命名为json的文件(主要是根据ID来分辨分站)

主程序文件内容:

package main

import (
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"net/rpc"
	"regexp"
	"strings"
	"text/template"
	"time"
)

var port *string = flag.String("l", "127.0.0.1:2789", "-l 127.0.0.1:2789")
var Index string
var Filelist string
<pre name="code" class="plain">var configlist map[string]string
var re *regexp.Regexp
type Info struct {Name stringTime time.Time}type Newlist []*Infotype pathlist struct {List NewlistDir string}func main() {flag.Parse()Index = fmt.Sprintf(`<html><title>分区列表</title><body><table>{{range $k,$v := .}}<tr><td><a href="http://%s/{{$k}}/">分区:{{$k}}</a></td></tr>{{end}}</table></body></html>`, *port)Filelist = fmt.Sprintf(`<html><title>文件列表</title><body><table>{{$path := .Dir}}{{range $k,$v := .List}}<tr><td><a href="http://%s{{$path}}/{{$v.Name}}">文件名:{{$v.Name}}</a></td><td>  修改时间:{{$v.Time}}</td></tr>{{end}}</table></body></html>`, *port)re, _ = regexp.Compile("^/[0-9]{7}/")b, _ := ioutil.ReadFile("json")json.Unmarshal(b, &configlist)http.HandleFunc("/", route)e := http.ListenAndServe(*port, nil)fmt.Println(e)}func route(w http.ResponseWriter, r *http.Request) {if r.URL.Path == "/" {t := template.New("")t.Parse(Index)t.Execute(w, configlist)}if re.MatchString(r.URL.Path) {getlist(r.URL.Path, w)}}func getlist(path string, w http.ResponseWriter) {l_path := strings.Split(path, "/")id := l_path[1]path = strings.Join(l_path[2:], "/")client, err := rpc.DialHTTP("tcp", configlist[id])if err != nil {fmt.Println(err)}var x Newlisterr = client.Call("Info_list.List", path, &x)if err != nil {if err.Error() == path {getfile(path, id, w)return}fmt.Fprintln(w, err)return}if path == "" {path = "/" + id} else {path = "/" + id + "/" + path}var Pl pathlist = pathlist{x, path}T := template.New("")T.Parse(Filelist)T.Execute(w, Pl)}func getfile(path, id string, w http.ResponseWriter) error {r, e := http.Get(fmt.Sprintf("http://%s/%s", configlist[id], path))if e != nil {fmt.Println(e)return e}io.Copy(w, r.Body)return nil}


json 文件内容:

{"7400006":"192.168.80.247:6987",
"7400007":"127.0.0.1:1987"}

分站程序:

目录结构我使用的是: --agent -|

---http.go

---sort.go

 --maste.go

http.go内容:

package agent

import (
	"errors"
	"fmt"
	"net/http"
	"net/rpc"
	"os"
)

var Http_path string

type Info_list int

func HttpServer(port, path string) {
	Http_path = path
	rpc.Register(new(Info_list))
	rpc.HandleHTTP()
	http.Handle("/", http.FileServer(http.Dir(path)))
	err := http.ListenAndServe(fmt.Sprintf(port), nil)
	fmt.Println(err)
}

func (i *Info_list) List(path string, result *Newlist) error {
	path_l := Http_path + "/" + path
	info, e := os.Stat(path_l)
	if e != nil {
		return e
	}
	if info.IsDir() {
		L, _ := GetFilelist(path_l)
		*result = L
		return nil
	} else {
		return errors.New(path)
	}
}
sort.go内容:

package agent

import (
	"io/ioutil"
	"sort"
	"time"
)

type Info struct {
	Name string
	Time time.Time
}

type Newlist []*Info

func GetFilelist(path string) (Newlist, error) {
	l, err := ioutil.ReadDir(path)
	if err != nil {
		return []*Info{}, err
	}
	var list []*Info
	for _, v := range l {
		list = append(list, &Info{v.Name(), v.ModTime()})
	}
	sort.Sort(Newlist(list))
	return list, nil
}

func (I Newlist) Len() int {
	return len(I)
}
func (I Newlist) Less(i, j int) bool {
	return I[i].Time.Unix() < I[j].Time.Unix()
}
func (I Newlist) Swap(i, j int) {
	I[i], I[j] = I[j], I[i]
}

maste.go内容:

package main

import (
	"agent"
	"flag"
)

func main() {
	var port *string = flag.String("l", ":1789", "-l :1789 或者 -l 127.0.0.1:1789 默认是监听在1789的端口上")
	var path *string = flag.String("p", "./", "-p ./ 或者 -p D:\\code")
	flag.Parse()
	go agent.HttpServer(*port, *path)
	select {}
}





var configlist map[string]string
var re *regexp.Regexp

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用GO语言实现的日志集中查看的小功能.

标签:golang   go语言   结构   服务器   游戏   

原文地址:http://blog.csdn.net/fyxichen/article/details/46971619

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!