diff --git a/io/logs/BUILD.bazel b/io/logs/BUILD.bazel index 140b7553c..24f61e9e1 100644 --- a/io/logs/BUILD.bazel +++ b/io/logs/BUILD.bazel @@ -13,6 +13,7 @@ go_library( "//cache/lru:go_default_library", "//config/params:go_default_library", "//crypto/rand:go_default_library", + "//io/file:go_default_library", "@com_github_hashicorp_golang_lru//:go_default_library", "@com_github_sirupsen_logrus//:go_default_library", ], diff --git a/io/logs/logutil.go b/io/logs/logutil.go index ea510da64..7d81fbfb1 100644 --- a/io/logs/logutil.go +++ b/io/logs/logutil.go @@ -6,9 +6,11 @@ import ( "io" "net/url" "os" + "path/filepath" "strings" "github.com/prysmaticlabs/prysm/v5/config/params" + "github.com/prysmaticlabs/prysm/v5/io/file" "github.com/sirupsen/logrus" ) @@ -20,6 +22,9 @@ func addLogWriter(w io.Writer) { // ConfigurePersistentLogging adds a log-to-file writer. File content is identical to stdout. func ConfigurePersistentLogging(logFileName string) error { logrus.WithField("logFileName", logFileName).Info("Logs will be made persistent") + if err := file.MkdirAll(filepath.Dir(logFileName)); err != nil { + return err + } f, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, params.BeaconIoConfig().ReadWritePermissions) // #nosec G304 if err != nil { return err diff --git a/io/logs/logutil_test.go b/io/logs/logutil_test.go index 1863922f5..0612f6798 100644 --- a/io/logs/logutil_test.go +++ b/io/logs/logutil_test.go @@ -1,6 +1,8 @@ package logs import ( + "fmt" + "os" "testing" "github.com/prysmaticlabs/prysm/v5/testing/require" @@ -24,3 +26,38 @@ func TestMaskCredentialsLogging(t *testing.T) { require.Equal(t, MaskCredentialsLogging(test.url), test.maskedUrl) } } + +func TestConfigurePersistantLogging(t *testing.T) { + testParentDir := t.TempDir() + + // 1. Test creation of file in an existing parent directory + logFileName := "test.log" + existingDirectory := "test-1-existing-testing-dir" + + err := ConfigurePersistentLogging(fmt.Sprintf("%s/%s/%s", testParentDir, existingDirectory, logFileName)) + require.NoError(t, err) + + // 2. Test creation of file along with parent directory + nonExistingDirectory := "test-2-non-existing-testing-dir" + + err = ConfigurePersistentLogging(fmt.Sprintf("%s/%s/%s", testParentDir, nonExistingDirectory, logFileName)) + require.NoError(t, err) + + // 3. Test creation of file in an existing parent directory with a non-existing sub-directory + existingDirectory = "test-3-existing-testing-dir" + nonExistingSubDirectory := "test-3-non-existing-sub-dir" + err = os.Mkdir(fmt.Sprintf("%s/%s", testParentDir, existingDirectory), 0700) + if err != nil { + return + } + + err = ConfigurePersistentLogging(fmt.Sprintf("%s/%s/%s/%s", testParentDir, existingDirectory, nonExistingSubDirectory, logFileName)) + require.NoError(t, err) + + //4. Create log file in a directory without 700 permissions + existingDirectory = "test-4-existing-testing-dir" + err = os.Mkdir(fmt.Sprintf("%s/%s", testParentDir, existingDirectory), 0750) + if err != nil { + return + } +}