首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想用最少的代码行从服务器检索多个日志

我想用最少的代码行从服务器检索多个日志
EN

Stack Overflow用户
提问于 2011-05-02 21:04:12
回答 2查看 2.2K关注 0票数 5

我想从Ubuntu服务器(在Win7机器上使用Python2.7)检索多个日志文件,而不必编写冗长、重复的代码。我确信我可以使用循环来完成这个任务,但是我想不出任何有效的解决方案(新手程序员)。我需要比我更有经验的人的指导。在进阶阶段,我很感谢你的帮助。下面是我在脚本中使用的代码,用于登录到服务器并检索一个文件。下面是我希望同时检索的文件的路径示例:

/var/log/apache/a.log /var/log/apache/e.log /var/opt/smart/log/me.log /var/opt/smart/log/se.log

我还有几条路可走,但我想你已经明白了。以下是用于登录服务器的代码:

代码语言:javascript
复制
def do_siteserver(self, line):
   import paramiko



   paramiko.util.log_to_file('c:\Python27\paramiko-wininst.log')

   host = '10.5.48.65'
   port = 22
   transport = paramiko.Transport((host,port))


   while True:
        try:
           print '\n'
           passW = raw_input("Enter the SiteServer weekly password: ") 
           password = passW
           username = 'gilbert'
           print '\n'
           print 'Establishing SFTP connection to: ', host + ':' + str(port), '...'
           transport.connect(username = username, password = password)
           sftp = paramiko.SFTPClient.from_transport(transport)
           print 'Authorization Successful!!!'

           filepath = '/var/log/apache2/error.log'
           localpath = 'C:\\remote\\NewFile.log'
           sftp.get(filepath, localpath)
           sftp.close()
           transport.close()
           break


        except:
           print '\n'
           print "Authorization Failed!!!"
           break
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-02 21:10:28

而不是

代码语言:javascript
复制
filepath = '/var/log/apache2/error.log'
localpath = 'C:\\remote\\NewFile.log'
sftp.get(filepath, localpath)

我建议这样做:

代码语言:javascript
复制
log_names = {
    "/var/log/apache2/error.log" : 'C:\\remote\\NewFile.log',
    "/var/log/apache/a.log" : 'C:\\remote\\NewFile_a.log',
} # add here all the log files you want to retrieve
for log_file, local_name in log_names.iteritems():
    sftp.get(log_file, local_name)
票数 6
EN

Stack Overflow用户

发布于 2011-05-02 22:26:57

那个??:

代码语言:javascript
复制
def do_siteserver(self, line):
   import paramiko

   host = '10.5.48.65'
   port = 22
   username = 'gilbert'
   password = raw_input("\nEnter the SiteServer weekly password: ") 

   localpath = 'C:\\remote\\NewFile.log'
   paramiko.util.log_to_file('c:\Python27\paramiko-wininst.log')

   with open(localpath,'w') as lf:

       for filepath in ('/var/log/apache/a.log',
                        '/var/log/apache/e.log',
                        '/var/opt/smart/log/me.log'
                        '/var/opt/smart/log/se.log'):
           try:
               print '\nEstablishing SFTP connection to: {}: {}...'.format(host,port)
               transport = paramiko.Transport((host,port))
               transport.connect(username = username, password = password)
               sftp = paramiko.SFTPClient.from_transport(transport)
               print 'Authorization Successful!!!'

               lf.write("Content of server's file :   "+filepath+'\n\n')
               sftp.get(filepath, localpath)
               # or sftp.get(filepath, lf) ? 
               sftp.close()
               transport.close()
               lf.write("\n\n\n")

            except:
               print "\nAuthorization Failed!!!"
               break

我知道您只想将获取的内容记录在路径'C:\remote\NewFile.log‘的一个文件中

我不知道混合指令sftp.get(filepath, localpath)和指令lf.write()是否被授权。

编辑

现在我已经理解了目标,我可以提出一个更正确的代码:

代码语言:javascript
复制
def do_siteserver(self, line):
   import paramiko

   host = '10.5.48.65'
   port = 22
   username = 'gilbert'
   password = raw_input("\nEnter the SiteServer weekly password: ") 

   localpath = 'C:\\remote\\NewFile'
   paramiko.util.log_to_file('c:\Python27\paramiko-wininst.log')

   for filepath in ('/var/log/apache/a.log',
                    '/var/log/apache/e.log',
                    '/var/opt/smart/log/me.log'
                    '/var/opt/smart/log/se.log'):
       try:
           print '\nEstablishing SFTP connection to: {}: {}...'.format(host,port)
           transport = paramiko.Transport((host,port))
           transport.connect(username = username, password = password)
           sftp = paramiko.SFTPClient.from_transport(transport)
           print 'Authorization Successful!!!'

           sftp.get(filepath, localpath + filepath.replace('/','_'))
           sftp.close()
           transport.close()

        except:
           print "\nAuthorization Failed!!!"
           break

顺便说一句,在try部分中不需要break

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5857465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档