diff --git a/proof/proof/src/TProof.cxx b/proof/proof/src/TProof.cxx
index 2c24527056c9edaf2bd39c24480215c69f1fd8c8..63463bf92810386906c6499e3ce21d1d230b8266 100644
--- a/proof/proof/src/TProof.cxx
+++ b/proof/proof/src/TProof.cxx
@@ -11761,17 +11761,22 @@ void TProof::SaveWorkerInfo()
    // Loop over the list of workers (active is any worker not flagged as bad)
    TIter nxa(fSlaves);
    TSlave *wrk = 0;
+   TString logfile;
+   Ssiz_t dash;
    while ((wrk = (TSlave *) nxa())) {
       Int_t status = (fBadSlaves && fBadSlaves->FindObject(wrk)) ? 0 : 1;
+      logfile = wrk->GetWorkDir();
+      dash = logfile.Last('-');
+      if (dash != -1) logfile = logfile(0, dash);
       // Write out record for this worker
       fprintf(fwrk,"%s@%s:%d %d %s %s.log\n",
                    wrk->GetUser(), wrk->GetName(), wrk->GetPort(), status,
-                   wrk->GetOrdinal(), wrk->GetWorkDir());
+                   wrk->GetOrdinal(), logfile.Data());
       // Additional line, if required
       if (addlogext.Length() > 0) {
          fprintf(fwrk,"%s@%s:%d %d %s %s.%s\n",
                      wrk->GetUser(), wrk->GetName(), wrk->GetPort(), status,
-                     wrk->GetOrdinal(), wrk->GetWorkDir(), addlogext.Data());
+                     wrk->GetOrdinal(), logfile.Data(), addlogext.Data());
       }
    }
    
@@ -11779,11 +11784,13 @@ void TProof::SaveWorkerInfo()
    // the overall list)
    TIter nxb(fBadSlaves);
    while ((wrk = (TSlave *) nxb())) {
+      dash = logfile.Last('-');
+      if (dash != -1) logfile = logfile(0, dash);
       if (!fSlaves->FindObject(wrk)) {
          // Write out record for this worker
          fprintf(fwrk,"%s@%s:%d 0 %s %s.log\n",
                      wrk->GetUser(), wrk->GetName(), wrk->GetPort(),
-                     wrk->GetOrdinal(), wrk->GetWorkDir());
+                     wrk->GetOrdinal(), logfile.Data());
       }
    }
 
diff --git a/proof/proofd/inc/XrdProofdProofServMgr.h b/proof/proofd/inc/XrdProofdProofServMgr.h
index bf8a745bdd7d5a68ec4c99ae1e4cb162ec05e04a..4c5fc7b7570070bd6b8fc0d059bb90395809e135 100644
--- a/proof/proofd/inc/XrdProofdProofServMgr.h
+++ b/proof/proofd/inc/XrdProofdProofServMgr.h
@@ -268,6 +268,8 @@ public:
 
    int               CleanupProofServ(bool all = 0, const char *usr = 0);
 
+   void              GetLogFile(XrdProofdProtocol *p, XrdProofdProofServ *xps,
+                                XrdOucString &sessiondir, XrdOucString &logfile);
    void              GetTagDirs(int opt, XrdProofdProtocol *p, XrdProofdProofServ *xps,
                                 XrdOucString &sesstag, XrdOucString &topsesstag,
                                 XrdOucString &sessiondir, XrdOucString &sesswrkdir);
diff --git a/proof/proofd/src/XrdProofdProofServMgr.cxx b/proof/proofd/src/XrdProofdProofServMgr.cxx
index 20c0ad1620aaedd19cc7adc30aae7c55be37d4c2..c48a1e464bc5120775326b27269fe653e865dbc2 100644
--- a/proof/proofd/src/XrdProofdProofServMgr.cxx
+++ b/proof/proofd/src/XrdProofdProofServMgr.cxx
@@ -1830,10 +1830,12 @@ int XrdProofdProofServMgr::CreateFork(XrdProofdProtocol *p)
    TRACEP(p, FORK,"Forking external proofsrv");
    if (!(pid = fMgr->Sched()->Fork("proofsrv"))) {
 
-      // Finalize unique tag and relevant dirs for this session and create log file path
+      // Finalize unique tag and relevant dirs for this session
       GetTagDirs((int)getpid(),
                  p, xps, in.fSessionTag, in.fTopSessionTag, in.fSessionDir, in.fWrkDir);
-      XPDFORM(in.fLogFile, "%s.log", in.fWrkDir.c_str());
+
+      // Create log file path
+      GetLogFile(p, xps, in.fSessionDir, in.fLogFile);
 
       // Log to the session log file from now on
       if (fLogger) fLogger->Bind(in.fLogFile.c_str());
@@ -3327,6 +3329,34 @@ int XrdProofdProofServMgr::SetProofServEnv(XrdProofdManager *mgr, XrdROOT *r)
    return -1;
 }
 
+//______________________________________________________________________________
+void XrdProofdProofServMgr::GetLogFile(XrdProofdProtocol *p, XrdProofdProofServ *xps,
+                                       XrdOucString &sessiondir, XrdOucString &logfile)
+{
+   XrdOucString host   = fMgr->Host();
+   int          datime = (int)time(0);
+   XrdOucString ord    = xps->Ordinal();
+   XrdOucString role;
+
+   // Shorten host name
+   if (host.find(".") != STR_NPOS)
+      host.erase(host.find("."));
+
+   if (p->ConnType() == kXPD_MasterWorker) role = "worker";
+   else role = "master";
+
+   // Log file name format:
+   // <sessiondir>/[master|worker]-<ordinal>-<host>-<datetime>.log
+   // No PID is contained
+   XPDFORM(logfile, "%s/%s-%s-%s-%d.log",
+      sessiondir.c_str(),
+      role.c_str(),
+      ord.c_str(),
+      host.c_str(),
+      datime
+   );
+}
+
 //______________________________________________________________________________
 void XrdProofdProofServMgr::GetTagDirs(int pid,
                                        XrdProofdProtocol *p, XrdProofdProofServ *xps,