django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>

  纠正一下之前在<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没有技术可以修改这个开源的php日志程序罢了,当然,在做这个的时候,也是菜鸟一个,只是想自己尝试一下。高手可以直接跳过.....

  首先,写在前面,因为上班空闲时间不多,只有忙里偷闲或自己回家的时间弄下,所以这个前后的时间就比较久了。

  之前在上篇写到,是准备使用apache+django来搭建的,但是真的,我折腾了几次apache+wsgi的,我始终没有成功,无耐,我就没有再使用这个了。最终改为使用nginx+django来进行环境的搭建,这个搭建的相关的教程,如有意向的同学可以看这个.<nginx+uwsgi<django web环境的搭建>,个人感觉使用nginx+uwsgi,搭建的速度更快,而且几乎不用考虑什么版本的问题。真心为自己之前准备使用apache+wsgi而心痛自己。但是不得不说,有之前的经历所以看到这个nginx+uwsgi的思路,也一下子就清楚需要怎么操作了。

  然后其它的就是一些代码相关的了,这里也当是记录下自己的搭建的步骤吧!大晚上的写得详细些吧!

首先是settings.py的文件:<导入log,还有最底下面的静态路径的设置,这里稍微注意一下>

  1 """
  2 Django settings for searchlog project.
  3
  4 Generated by ‘django-admin startproject‘ using Django 1.8.7.
  5
  6 For more information on this file, see
  7 https://docs.djangoproject.com/en/1.8/topics/settings/
  8
  9 For the full list of settings and their values, see
 10 https://docs.djangoproject.com/en/1.8/ref/settings/
 11 """
 12
 13 # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 14 import os
 15
 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 17
 18
 19 # Quick-start development settings - unsuitable for production
 20 # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
 21
 22 # SECURITY WARNING: keep the secret key used in production secret!
 23 SECRET_KEY = ‘-qsjwm5iy%(yu+rq*u$3t4o+q(-sxn#o=0qt=mpb)8efto%lxd‘
 24
 25 # SECURITY WARNING: don‘t run with debug turned on in production!
 26 import socket
 27 if socket.gethostname() == ‘samcao-Lenovo-IdeaPad-Y470‘:
 28     DEBUG = TEMPLATE_DEBUG = True
 29 else:
 30     DEBUG = TEMPLATE_DEBUG = False
 31
 32 #DEBUG = TEMPLATE_DEBUG = False
 33 ALLOWED_HOSTS = [‘*‘]
 34
 35 # Application definition
 36
 37 INSTALLED_APPS = (
 38     ‘django.contrib.admin‘,
 39     ‘django.contrib.auth‘,
 40     ‘django.contrib.contenttypes‘,
 41     ‘django.contrib.sessions‘,
 42     ‘django.contrib.messages‘,
 43     ‘django.contrib.staticfiles‘,
 44     ‘log‘,
 45 )
 46
 47 MIDDLEWARE_CLASSES = (
 48     ‘django.contrib.sessions.middleware.SessionMiddleware‘,
 49     ‘django.middleware.locale.LocaleMiddleware‘,
 50     ‘django.middleware.common.CommonMiddleware‘,
 51     #‘django.middleware.csrf.CsrfViewMiddleware‘,
 52     ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
 53     ‘django.contrib.auth.middleware.SessionAuthenticationMiddleware‘,
 54     ‘django.contrib.messages.middleware.MessageMiddleware‘,
 55     ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
 56     ‘django.middleware.security.SecurityMiddleware‘,
 57 )
 58
 59 ROOT_URLCONF = ‘searchlog.urls‘
 60
 61 TEMPLATES = [
 62     {
 63         ‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
 64         ‘DIRS‘: [os.path.join(os.path.dirname(__file__),‘templates‘).replace(‘\\‘,‘/‘),],
 65         ‘APP_DIRS‘: True,
 66         ‘OPTIONS‘: {
 67             ‘context_processors‘: [
 68                 ‘django.template.context_processors.debug‘,
 69                 ‘django.template.context_processors.request‘,
 70                 ‘django.contrib.auth.context_processors.auth‘,
 71                 ‘django.contrib.messages.context_processors.messages‘,
 72             ],
 73         },
 74     },
 75 ]
 76
 77 WSGI_APPLICATION = ‘searchlog.wsgi.application‘
 78
 79
 80 # Database
 81 # https://docs.djangoproject.com/en/1.8/ref/settings/#databases
 82
 83 DATABASES = {
 84     ‘default‘: {
 85         ‘ENGINE‘: ‘django.db.backends.sqlite3‘,
 86         ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
 87
 88     }
 89 }
 90
 91
 92 # Internationalization
 93 # https://docs.djangoproject.com/en/1.8/topics/i18n/
 94
 95 LANGUAGE_CODE = ‘en-us‘
 96
 97 TIME_ZONE = ‘UTC‘
 98
 99 USE_I18N = True
100
101 USE_L10N = True
102
103 USE_TZ = True
104
105
106 # Static files (CSS, JavaScript, Images)
107 # https://docs.djangoproject.com/en/1.8/howto/static-files/
108 HERE = os.path.abspath(os.path.dirname(__file__))
109 STATIC_URL = ‘/static/‘
110 MEDIA_ROOT = os.path.join(HERE,‘static‘)
111 MEDIA_URL = ‘‘
112 ADMIN_MEDIA_PREFIX = ‘/static/admin/‘
113 #STATIC_ROOT = ‘/home/samcao/caodjango/searchlog/searchlog/static/‘
114 STATICFILES_DIRS = (
115     os.path.join(BASE_DIR,‘static‘),
116 )

settings.py

urls.py<就几个url,没有什么特殊的>,好吧,我不得不说,那个The Django Book 我只看了下前面的7章,而且还不认真.<http://djangobook.py3k.cn/2.0>

from django.conf.urls import include, url
from django.contrib import admin
from log import views
from django.conf import settings

urlpatterns = [
    url(r‘^admin/‘, include(admin.site.urls)),
    url(r‘^$‘,views.login),
    url(r‘^login/$‘,views.login),
    url(r‘^loginsuccess/$‘,views.loginsuccess),
    url(r‘^logout/$‘,views.logout),
]

urls.py

log/views.py--------现在目前还没有加上一些判断之类的.比较菜.只是简单的.

from django.shortcuts import render
from django.shortcuts import render_to_response
from django.http import HttpResponse,Http404
from django import forms
from django.contrib import auth
from django.http import HttpResponseRedirect
import datetime
from django.contrib.admin import widgets
import subprocess
import os.path
import fupy
#From Post
#from django.template import RequestContext

class loginForm(forms.Form):
    username = forms.CharField(max_length=30)
    password = forms.CharField(widget=forms.PasswordInput)

class searchForm(forms.Form):
    searchform = forms.CharField(label="Please Enter Search Content",min_length=1)
    day = forms.DateTimeField(label=‘Please Enter Log Date‘,widget=widgets.AdminDateWidget())

def login(request):
    if request.user.is_authenticated():
        return HttpResponseRedirect("/loginsuccess/")
    error = False
    if request.method == ‘POST‘:
        form = loginForm(request.POST)
        if form.is_valid():
            username = request.POST.get(‘username‘,‘‘)
            password = request.POST.get(‘password‘,‘‘)
            user = auth.authenticate(username=username,password=password)
            if user is not None and user.is_active:
                auth.login(request,user)
                return HttpResponseRedirect("/loginsuccess/")
            else:
                error=True
                #return HttpResponse("not user")
    else:
        form = loginForm()
    return render_to_response(‘login.html‘,{‘form‘:form,‘error‘:error})

def loginsuccess(request):
    if request.user.is_authenticated():
        if request.method == ‘POST‘:
            searchform = searchForm(request.POST)
            if searchform.is_valid():
                searchtext = searchform.cleaned_data[‘searchform‘]
                today = searchform.cleaned_data[‘day‘]
                today_day = str(today.day).zfill(2)
                #print today_day
                #print searchtext
                if ‘|‘ in searchtext:
                    searchtext_error = True
                    return render_to_response(‘search.html‘,{‘form‘:searchform,‘searchtext_error‘:searchtext_error,‘uname‘:request.user})
                logpath = os.path.join(‘/home/var/log/‘,str(today.year),str(today.month),today_day)
                if not os.path.exists(logpath):
                    file_error = True
                    return render_to_response(‘search.html‘,{‘form‘:searchform,‘file_error‘:file_error,‘uname‘:request.user})
                logpath = os.path.join(logpath,‘*‘)
                cmd = "sudo grep ‘%s‘ %s"%(searchtext,logpath)
                print cmd
                showlog = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
                text = showlog.communicate()
                textshow = text[0].split(‘\n‘)
                textshow2 = fupy.returnShowLog(textshow)
                return render_to_response(‘search.html‘,{‘showlog‘:textshow2,‘form‘:searchform,‘uname‘:request.user})
        else:
            searchform = searchForm(
                initial={‘day‘:datetime.datetime.now().strftime("%Y-%m-%d")}
            )
        return render_to_response(‘search.html‘,{‘form‘:searchform,‘uname‘:request.user})
    else:
        return HttpResponseRedirect("/login/")

def logout(request):
    auth.logout(request)
    return render_to_response("logout.html")

log/views.py

log/templates/base.html-----html模板文件,这里主要是导入bootstrap文件.其它的就没有什么了.

 1 {% load staticfiles %}
 2 <!DOCTYPE html>
 3 <html>
 4 <head>
 5 <meta charset="utf-8" />
 6 {% block title %}<title>Searchlog</title>{% endblock %}
 7 <!-- <script src="{% static ‘bootstrap/js/jquery.ui-1.9.0.min.js‘ %}"></script> -->
 8  <script src="{% static ‘bootstrap/js/jquery.min.js‘ %}"></script>
 9  <!-- 引入 Bootstrap -->
10  <link href="{% static ‘bootstrap/css/bootstrap.min.css‘ %}" rel="stylesheet">
11  <script src="{% static ‘bootstrap/js/html5shiv.js‘ %}"></script>
12  <script src="{% static ‘bootstrap/js/respond.min.js‘ %}"></script>
13  <script type="text/javascript" src="{% static ‘bootstrap/js/bootstrap.js‘ %}"></script>
14  <style type="text/css" src="{% static ‘bootstrap/css/bootstrap.css‘ %}"></style>
15 </head>
16 <body>
17 {% block content %}
18 {% endblock %}
19 </body>
20 </html>

log/templates/base.html

log/templates/login.html-------登陆窗口页面

 1 {% extends "base.html" %}
 2 {% block content %}
 3 <div class="container">
 4     <div class="row">
 5         <div class="col-md-6 col-md-offset-3">
 6                 {% if error %}
 7                     <div class="alert alert-warning alert-dismissible" role="alert">
 8                           <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
 9                           <strong>提示:</strong>您的账号或者密码有误,请重新进行登陆,谢谢!
10                     </div>
11                 {% endif %}
12                 <div class="jumbotron">
13               <form class="form-signin" role="form" method="POST" action="">{% csrf_token %}
14                   <h2 class="form-signin-heading">Please sign in</h2>
15                     <input class="form-control" placeholder="{{ form.username.name }}" required="" autofocus="" type="{{ form.username.name }}" name="{{ form.username.name }}">
16                     <input class="form-control" placeholder="Password" required="" type="password" name="{{ form.password.name }}">
17                     <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
18               </form>
19               </div>
20         </div>
21     </div>
22 </div>
23 {% endblock %}

log/templates/login.html

log/templates/search.html----查询窗口页面

 1 {% extends "base.html" %}
 2 {% block content %}
 3 <div class="container">
 4     <div class="row">
 5         <div class="col-md-12 col-md-offset-0">
 6             <h3>Hello {{ uname.username }}</h3>
 7                 <form method="POST" action="">
 8                         {% if form.searchform.errors %}
 9                             <div class="alert alert-success" role="alert">
10                                 <strong>警告!</strong> 请输入需要搜索的日志内容!<br>
11                             </div>
12                         {% endif %}
13                         {% if form.day.errors %}
14                             <div class="alert alert-success" role="alert">
15                                 <strong>警告!</strong> 请输入搜索日志时间!
16                             </div>
17                         {% endif %}
18                         {% if searchtext_error %}
19                             <div class="alert alert-warning alert-dismissible" role="alert">
20                               <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
21                               <strong>Warning!</strong> 请搜索正确的内容!不要在搜索内容中带有“|”符号,谢谢!
22                             </div>
23                             <p style="color: red;"></p>
24                         {% endif %}
25                         {% if file_error %}
26                             <div class="alert alert-warning alert-dismissible" role="alert">
27                               <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
28                               <strong>Warning!</strong> 您搜索的日期没有日志,请输入正确的日期,谢谢!格式如:2016-10-10
29                             </div>
30                         {% endif %}
31                     <input class="form-control" placeholder="{{ form.searchform.label }}" type="text" name="{{ form.searchform.name }}" style="width:800px;">
32                     <input class="form-control" type="text" name="{{ form.day.name }}" size="10" value="{{ form.day.value }}" style="width:130px;">
33                     <!-- {{form.as_p}}-->
34
35                     <!-- <input type="submit" value="searchlog"> -->
36                     <button type="submit" class="btn btn-primary">Search</button>
37                     <a href="/logout/">注销登陆</a><br/>
38                     <hr>
39                         <table class="table table-hover">
40                             <thead>
41                                 <th>序列</th><th>日志内容</th>
42                             </thead>
43                             {% for logline in showlog %}
44                             <tr>
45                                 <td>{{ forloop.counter }}</td><td>{{ logline }}</td>
46                             </tr>
47                             {% endfor %}
48                         </table>
49                 </form>
50         </div>
51
52     </div>
53 </div>
54 {% endblock %}

log/templates/search.html

恩,好吧,大概就是这样一个页面的东西了,没有什么其它的东西了!回想起来还是非常简单的,最麿人的事情是在apache+wsgi的时候,好了!那都是后话了,这样试了下,每天大概有几百M的日志,这样查没有什么问题,响应速度还是不错的。好吧,是好垃圾个,暂时时间与能力有限,先这样,后面再慢慢的进行修改优化下!!!

时间: 10-23

django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>的相关文章

rsyslog + mysql + loganalyzer 构建日志服务器

rsyslog支持的特性 支持多线程 支持tcp,ssl,tls.relp 可以把日志存储于关系型数据库中 支持过滤器,可以实现过滤日志中的任意部分. 支持自定义格式 适用于企业级的日志记录需求. 功能模块化 rsyslog用facility接收各个应用和程序的日志,并把日志分类.有以下几类 auth        与认证相关的 authpriv 与用户认证授权相关的,如用户登陆 cron     与周期任务相关的 daemon    与守护进程相关的 kern        与内核相关的 lp

rsyslog+MySQL+loganalyzer日志集中分析管理

前言   rsyslog系统日志,在CentOS5上叫syslog,而在CentOS6上叫rsyslog,叫增强版的syslog,CentOS5上的配置文件在/etc/syslog.conf下,而CentOS6在/etc/rsyslog.conf下.       syslog默认是把我们的日志放到文件.用户.日志服务器.管道中.       rsyslog在syslog的基础上还多了一条途径,允许把日志放到mysql数据中.       rsyslog比syslog好在哪里:       Mul

rsyslog+mysql+loganalyzer 环境搭建日志服务器

环境:CentOS6.6 rsyslog+mysql+loganalyzer 环境搭建日志服务器 Client端:    192.168.2.10 MySQL服务器:  192.168.2.11 # Client端安装必备的软件包 yum install rsyslog-mysql -y 生成了2个文件: /lib64/rsyslog/ommysql.so           #rsyslog支持数据库的模块文件 /usr/share/doc/rsyslog-mysql-5.8.10/creat

基于rsyslog+mysql+loganalyzer构建一个小而美的日志服务器

前言: 每当我们遇到问题抓耳挠腮,一脸懵那啥的时候,也许看一下日志就瞬间豁然开朗,所以,一个易用的日志服务器还是很重要的.我们先不介绍elk,那个牛逼吊炸天的日志分析系统.今天我们先来构建一个小的日志服务器.elk我们以后再说~ 正文: 当我们配置完一个服务,启动报错时,那感觉就像吃了啥一样,别提多难受,除非服务程序本身有检测配置文件的程序,不然我们就得依赖linux自己的集中日志服务器rsyslog了.不过,有时候也许我们想搜索一下某条日志,或者向用可视化的界面进行统计分析.此时我们可以把日志

史上最全使用Nexus搭建Maven服务器详细配置

为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库. 1.首先确定我们的环境安装好maven,jdk等必须的环境 2.这些都准备好之后,去下载最新版本的nexus    下载地址:http://www.sonatype.org/nexus/go 我本地安装的是 ne

Rsyslog介绍以及结合loganalyzer进行日志分析

1.syslog介绍: 日志服务在CentOS 5上默认为syslog,而6上全部升级为rsyslog.Rsyslog是syslog的增强版,提供了很多高级的特性.syslog由两个进程构成,klogd和syslogd,klogd记录Kernel产生的日志信息,而syslogd是普通的日志信息.除了一些高级特性,Rsyslog和syslog的整体框架基本一致. 2.Rsyslog的特性: 支持选择UDP|TCP协议传送日志文件: 支持SSL加密: 多线程模型工作: 可以将日志放入关系型数据库中:

一步步安装nginx搭建流媒体服务器

先安装: apt-get install g++ apt-get install g++ apt-get install build-essential 一般已经安装了 在网上下载以下的包.后面我把这些包上传到csdn资源里,以后就不用找了. nginx-1.2.3.tar.gz      :应用服务器主程序 nginx_mod_h264_streaming-2.2.7.tar.gz      :MP4流媒体支持模块. openssl-1.0.1c.tar.gz                

django开发个人简易Blog—nginx+uwsgin+django1.6+mysql 部署到CentOS6.5

前面说完了此项目的创建及数据模型设计的过程.如果未看过,可以到这里查看,并且项目源码已经放大到github上,可以去这里下载. 代码也已经部署到sina sea上,地址为http://fengzheng.sinaapp.com/ 先跳过视图展示及表单处理的部分,先介绍一下如何部署. 标题中已经把部署环境介绍的很清楚了: 服务器:CentOS6.5 其实就是我的开发机 mysql:Server version: 5.1.73 Source distribution nginx版本: nginx/1

ZabbixAPI+django+nginx简单的二次开发实例(三)

接上一篇博文 ZabbixAPI+django+nginx简单的二次开发实例(二) 步骤三,站点架构部分 本部分用到的软件 1,Nginx:接受访问请求,应答静态页面,转发动态请求至uwsgi 2,uwsgi:应答动态请求 3,Django:处理后台数据 4,supervisor:管理进程 首先安装Nginx yum install epel-release yum install python-devel nginx 修改配置文件 vim /etc/ngnix/ngnix.conf user