2016-04-17 3 views
1

J'utilise python-watchdog pour surveiller certains chemins pour des changements comme ajouter, supprimer, modifier, etc. Avec l'heure et les informations de message, je veux capturer le nom d'utilisateur de l'utilisateur qui a fait cette modification. Je regardais getpass, et j'ai cherché une variable dans la journalisation, mais je n'ai rien trouvé.Comment capturer le nom d'utilisateur de l'utilisateur du système d'exploitation en utilisant la bibliothèque de journalisation de python?

Des indices? Mon code de chien de garde est au-dessous

print 'starting the watcher mate...' 
create_log_file() 
logging.basicConfig(filename = log_file, level = logging.INFO, format = '%(asctime)s - %(message)s', datefmt = '%Y-%m-%d %H:%M:%S') 
path = sys.argv[1] if len(sys.argv) > 1 else '/etc/nginx/' 
event_handler = LoggingEventHandler() 
observer = Observer() 
observer.schedule(event_handler, path, recursive=True) 
observer.start() 
+5

Cela pourrait aider: http://stackoverflow.com/questions/842059/is-there-a-portable-way-to-get-the-current-username-in-python –

Répondre

2

Mise à jour

j'ai pu résoudre mon problème thusly. J'ai résolu le problème en utilisant la méthode Overriding. J'ai créé une autre classe dans mon script python appelé MyLoggingEventHandler et inclus le nom de l'utilisateur en utilisant la fonction getpass.getuser(). Maintenant, je suis en mesure d'obtenir les détails de l'utilisateur dans mes déclarations de journal.

code

class MyLoggingEventHandler(LoggingEventHandler): 

    def on_moved(self, event): 
      super(LoggingEventHandler, self).on_moved(event) 
      what = 'directory' if event.is_directory else 'file' 
      logging.info("Moved %s: from %s to %s, by %s", what, event.src_path, event.dest_path, getpass.getuser()) 

    def on_created(self, event): 
      super(LoggingEventHandler, self).on_created(event) 
      what = 'directory' if event.is_directory else 'file' 
      logging.info("Created %s: %s, by %s", what, event.src_path, getpass.getuser()) 

    def on_deleted(self, event): 
      super(LoggingEventHandler, self).on_deleted(event) 
      what = 'directory' if event.is_directory else 'file' 
      logging.info("Deleted %s: %s, by %s", what, event.src_path, getpass.getuser()) 

    def on_modified(self, event): 
      super(LoggingEventHandler, self).on_modified(event) 
      what = 'directory' if event.is_directory else 'file' 
      logging.info("Modified %s: %s, by %s", what, event.src_path, getpass.getuser()) 

Ce sont 2 lignes de mon fichier journal.

2016-04-17 15:23:16 - Modified file: /path/to/file.txt, by myusername - 
2016-04-17 15:23:19 - Modified file: /path/to/file2.txt, by myusername - 
+2

Le nom d'utilisateur peut » t changer au cours de l'exécution, de sorte que vous pouvez rendre votre classe plus efficace. Appelez 'getpass.getuser()' dans la méthode '__init__' et enregistrez-le en tant qu'attribut d'instance pour que les autres méthodes puissent y accéder. –

+0

@ PM2Ring - Accepté. Ça ira. Merci! –

+1

Cela ne renverra que le nom d'utilisateur local exécutant la console. Mon chien de garde surveille un partage de fichiers, comment puis-je retourner le nom d'utilisateur/nom d'hôte du client? – ChristianG